使用new操作符的时候发生了什么?
当使用new操作符调用一个构造函数的时候主要做了以下事情
- 创建一个空对象,并将空对象的__proto__与构造函数的原型联系起来
- 将构造函数的this指向这个新创建的空对象
- 根据执行这个构造函数返回的结果,来确定new操作符返回什么,如果执行构造函数后返回的是一个引用类型,那么new操作符返回这个引用类型,否则返回新创建的这个对象
简单实现一个new操作符
function myNew() {
let constructor = [].shift.call(arguments),
// 创建一个新对象,将对象的__proto__指向构造函数的原型
obj = Object.create(constructor.prototype);
// 将构造函数的this指向新创建的对象obj,然后将参数传递进去
let result = constructor.call(obj, ...arguments);
// 判断执行构造函数然后的结果是否是对象,如果是对象则返回这个对象,那么就意味着,整个构造函数失效,返回整个引用值类型,否则返回这个新构建的对象
return typeof result === 'object' ? result : obj;
}
测试一下
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.say = function () {
console.log(this.age, this.namse);
};
let p1 = myNew(Person, "张三", 18);
console.log(p1.name);
console.log(p1);
p1.say();