本文学习记录了new操作符的实现过程。
new操作符做了什么
- 创建一个
新对象obj
。 - 这个对象的
__proto__
属性会指向构造函数的原型prototype
的地址。 - 构造函数中的
this指向新对象obj
,并且执行构造函数
。 - 如果构造函数无返回值,或者返回值不是对象类型
Object
(包含Functoin
,Array
,Date
,RegExp
,Error
),则返回新对象obj;如何构造函数的返回值是Object
,则返回它。
模拟new操作符
function newOperator(ctor) {
// 传入的第一个参数必须为函数
if (typeof ctor !== 'function') {
throw new TypeError(ctor + 'is not a function.');
}
// ES6 new.target指向的是new调用的构造函数
newOperator.target = ctor;
// 1. 创建一个新对象newObj
// 2. 这个对象的__object__属性指向ctor的原型
var newObj = Object.create(ctor.prototype);
// 3. 构造函数ctor中的this指向新对象newObj,并且执行ctor
var argsArr = [].slice.call(arguments, 1);
var ctorReturnResult = ctor.apply(newObj, argsArr);
// 4. 返回值是对象类型,则返回它。否则返回新对象newObj
var isObject = typeof ctorReturnResult === 'object' && ctorReturnResult !== null;
var isFunction = typeof ctorReturnResult === 'funcion';
if (isObject || isFunction) {
return ctorReturnResult;
}
return newObj;
}