讲讲对new的理解
当一个实例对象被new出来后,这个实例对象能做什么呢?
- 实例对象能够访问构造函数的prototype对象
- 实例对象拥有构造函数的属性
new操作符的执行过程:
- 创建新的空白对象
- 将构造函数的prototype对象设为新对象的原型(实例对象能够访问构造函数的prototype对象👌)
- 将构造函数的this指向新对象,在新对象上执行构造函数的代码,利用构造函数.call(新对象,参数)实现 (实例对象拥有构造函数的属性👌)
- 判断返回值的类型,如果是基本类型,则返回这个对象,如果是引用类型,则返回这个引用类型的对象
new操作符的实现代码:
function myNew (constructor, ...args) {
// 1.obj 继承构造函数原型上的属性
let obj = Object.create(constructor.prototype);
// 2.obj 拥有构造函数的属性(obj 执行constructor就可以了)
let res = constructor.call(obj, ...args);
// 3. 返回值:如果是引用类型,返回res,如果是基本类型,返回obj
return res instanceof Object ? res : obj;
}
// 测试代码
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log(this.name);
}
let p1 = new Person("new xiaomi");
console.log(p1);
p1.sayName();
let p2 = myNew(Person,"myNew xiaomi")
console.log(p2);
p2.sayName();