一、构造函数的写法
1.固定参数(不建议使用)
function Car(name, color, suv) {
this.name = name;
this.color = color;
this.suv = suv;
}
var benchi = new Car("benchi", "red", true);
console.log(benchi);
使用这个方法时需要注意:
-
明确知道对象属性
-
位置要严格对应
2. 对象类型参数
function Car(obj) {
this.name = obj.name;
this.size = obj.size;
this.color = obj.color;
this.suv = obj.suv;
}
var audi = new Car({ size: "big", name: "audi", suv: true, color: "red" });
console.log(audi);
即使传参顺序不同也不影响并且有维护方便,使用方便的特点,推荐使用。
二、new 的作用(面试)
1.如果不用 new 直接调用构造函数,会提示undefined
function Student(obj) {
this.name = obj.name;
this.score = obj.score;
this.grade = obj.grade;
}
var stu1 = Student({
name: 'Jack',
score: 88,
grade: 3,
});
console.log(stu1);
由此可以确定,new 的第一个作用是把对象返回了回来(类似于函数没有 return 会提示 undefined )。
2.如果在没有 new 的情况下打印 this ,发现 this 指向 window 。
function Student(obj) {
this.name = obj.name;
this.score = obj.score;
this.grade = obj.grade;
console.log(this);
}
var stu1 = Student({
name: 'Jack',
score: 88,
grade: 3,
});
由此可见 new 的第二个作用,把构造函数的this指向了要返回的对象。
3.总结new作用:
- 创建了新空对象
- 将构造函数的作用域赋值给新对象(this指向新对象)
- 执行构造函数代码 (为这个新对象添加属性)
- 返回新对象
三、深拷贝与浅拷贝(面试)
1.浅拷贝
定义:对于引用类型而言,指两个引用类型指向同一个地址,改变一个,另一个也会随之改变。
var person1 = { age: 20 };
var person2 = person1;
person1.age = 25;
console.log("person1:", person1, "person2:", person2);
2.深拷贝
定义:对于引用类型而言,复制后引用类型指向一个新的内存地址,两个对象改变互不影响。
var p1 = { age: 18 };
//JSON.stringify序列化 JSON.parse反序列化
var p2 = JSON.parse(JSON.stringify(p1));
p1.age = 20;
console.log(p2);
注意:基础类型数据的赋值与深拷贝类似,但并不是深拷贝。
var a = 1;
var b = a;
a = 10;
console.log(a, b); // 10 1
注意:数组的concat、slice是一层对象的深拷贝,如果对象的子属性是引用类型的话,就是浅拷贝。
var a = [1, 2, 3];
var b = [4, 5];
var ab = a.concat(b);
a = [2, 3];
console.log(ab); // [1,2,3,4,5]