参考文章:
1. 阮一峰老师
2. 知乎
一、new命令的原理
1. 创建一个空对象instance,作为将要返回的对象实例。
2. 将这个空对象instance的__proto__,指向constructor(构造函数)的prototype属性。
3. 将这个空对象instance赋值给constructor内部的this关键字(将constructor内部的this关键字指向instance)
4. 开始执行构造函数内部的代码
5. 判断return的类型,若返回结果是对象,就直接返回,否者返回instance(即constructor指向的对象)。
如果没有写return,相当于return undefined
function _new(constructor, ...args) {
const instance = Object.create(constructor.prototype);//这里实现了1,2两点。 instance.__proto__ === constructor.prototype -> true
const result = constructor.apply(instance, args); //这里实现了3,4两点。
return (typeof result === 'object' && result !== null) ? result: instance;
}
二、new.target
这里只是简要说明:具体的还是查看上面的三个链接。
new.target可以判断一个constructor是否是通过new出来的。
场景:
function A(a, b) {this.a = a;this.b = b; if (!new.target) {throw new Error('not by new');}}
_new(A, 1, 2) // Uncaught Error: not by new
new A(1,2); // A {a: 1, b: 2}