new的实现
# new操作符做了什么
- 创建了一个全新的对象。
- 这个对象会被执行[[Prototype]](也就是__proto__)链接。
- 生成的新对象会绑定到函数调用的this。
- 通过new创建的每个对象将最终被[[Prototype]]链接到这个函数的prototype对象上。
- 如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用会自动返回这个新的对象。
function myNew(ctor) {
if (typeof ctor !== "function") {
throw new Error("ctor must be a function");
}
myNew.target = ctor; // 根据ES6种new.target指向构造函数
var newObj = Object.create(ctor.prototype); // 以ctor的原型为原型创建一个新的对象
var argsArr = [].slice.call(arguments, 1); // 获取除ctor外后面的所有实参
var ctorReturnResult = ctor.apply(newObj, argsArr); // 执行构造函数,但是this绑定到newObj,为newObj赋值属性相当于
var isObject =
typeof ctorReturnResult === "object" && ctorReturnResult !== null;
var isFunction = typeof ctorReturnResult === "function";
if (isObject || isFunction) {
return ctorReturnResult;
}
return newObj;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20