new 的过程中发生了什么?
如果一个函数被使用new操作符调用了,那么它会执行如下操作:
- 在内存中创建一个新的对象(空对象);
- 这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性;
- 构造函数内部的this,会指向创建出来的新对象;
- 执行函数的内部代码(函数体代码);
- 如果构造函数没有返回非空对象,则返回创建出来的新对象;
实现一个简单的new
function _new(fn, ...arg) {
// 1.创建一个新对象
let o = new Object();
// 2.把o的__proto__指向fn的prototype,实现继承
o.__proto__ = fn.prototype;
// 有的浏览器不兼容__proto__,这里可以使用Object.setPrototypeOf建立原型的连接
// Object.setPrototypeOf(o, fn.prototype);
// 3 - 4.改变this指向,并执行构造函数内部代码
let resObj = fn.apply(o, arg);
// 5.如果返回值是一个object类型,则返回这个结果,否则返回这个新创建的对象
return typeof resObj === "object" ? resObj : o;
}