基础
什么是面向对象: 面向对象它是一个编程思路,不会改变我们预期的效果。
优点: 使用面向对象,会让代码的复用性大大的提高,便于迭代
对比:
面向过程:小花去食堂点餐吃饭。
面向对象:小花-去-吃 、 食堂-点餐
小花.去 食堂.点餐 小花.吃
创建对象的两种方式:
- 字面量
let nan = "性别";
let obj = {
name:"小涛",
nan:"男",
age:"17",
hobby:function(){
console.log("喜欢做题");
}
};
- 通过构造函数
let obj2 = new Object();
对象的使用:
- 通过点语法
console.log(obj.name);
- 通过中括号
console.log(obj["nan"]);
上述两者的区别: 如果通过点语法无法获取到对象中“正确”的属性/方法名,可以使用中括号的方式来获取
工厂模式
创建对象的第三种方式: 工厂模式
function Person(name,age,sex,fn){
// 1. (形参) --> 运输材料
//2. 创建对象并赋值 --> 加工材料
let obj = {};
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.hobby = fn;
return obj;
// 3. 出厂
}
function fn(){
console.log("我是一个兵,来自老百姓");
}
let dada = Person("光达","18","男");
let daxian = Person("大仙","20","男",fn);
console.log(dada.sex);
console.log(daxian.name);
daxian.hobby();
构造函数
创建对象的第四种方式:构造函数——函数名的首字母 需要大写, 以此来和普通函数进行区别
function Person(name,age,sex,fn){
this.name = name;
this.age = age;
this.sex = sex;
this.hobby = fn;
}
// new运算符: 也叫做new构造器, 配合使用的函数,被称为构造函数
let obj = new Person();
new运算符
作用:
- 执行该函数
- 隐式创建一个对象
- 把该对象和函数的 this指向 互相绑定
- 可以把this中的属性和方法都加到 该对象上
- 函数执行后,返回该对象
function txt(name){
this.name = name;
this.age = age;
this.sex = sex;
this.hobby = function(){
console.log("我是一个兵");
}
}
实例化对象:
let obj = new txt("阿");
console.log(obj.name);
原型
每次通过构造函数去实例化对象,都会生成一个新的内存空间
当项目开发中,往往大量的内存使用,会严重影响性能
原型: 将公有的方法,放到原型中,每次实例化对象,原型中的内容是公有的,不会再分配新的空间给对象 (构造函数中的属性/方法 会)
function Person(name,sex){
this.name = name;
this.age = age;
this.sex = sex;
this.hobby = function(){
console.log("喜欢游泳~");
};
}
Person.prototype.s = function(){
console.log(this.sex);
}
Person.prototype.e = eat;
function eat(){
console.log(`我${this.name}饿了`);
}
let san = new Person("张三","男");
console.log(san.name); // 张三
san.s(); // 男
san.e(); //我张三饿了
let lisi = new Person("李四","女");
let MaZi = new Person("麻子","未知");
console.log(lisi.name); //李四
console.log(san.name); //张三
lisi.s(); //女
lisi.e(); //我李四饿了
原型中的方法,地址相同,是一个公有的内存
console.log(san.e === lisi.e);// true
构造函数中的方法,地址不相同。 两个独立的内存
console.log(san.hobby === lisi.hobby); // false
san.hobby(); //喜欢游泳
lisi.hobby(); //喜欢游泳
输出一下对象的__proto__ === Person.prototype
console.log(MaZi.__proto__ === Person.prototype);//true
console.log(Person.prototype.constructor === Person);// true