前言
最近面试被问到了,没回答上来,在此小记一篇。
new 操作符步骤
- 创建一个空对象,空对象的__proto__执行ctor的prototype。
- 执行ctor函数,执行空对象,参数是当前函数的参数(除ctor以为),得到一个结果。
- 判断一下结果是否是对象或者函数,如果是则返回结果,如果不是返回空对象。
根据操作步骤得到以下代码:
function newOperator (ctor) {
if (typeof ctor !== 'function') {
throw 'newOperator function the first param must be a function';
}
var newObj = Object.create(ctor.prototype); // 第一步
var argsArr = [].slice.call(arguments, 1);
var ctorReturnResult = ctor.apply(newObj, argsArr); // 第二部
var isObject = typeof ctorReturnResult === 'object' && ctorReturnResult !== null;
var isFunction = typeof ctorReturnResult === 'function';
if (isObject || isFunction) {
// 第三步
return ctorReturnResult;
}
return newObj;
}
在这里有人推荐把第一步分开,例如:
var newObj = new Object();
newObj.__proto__ = Object.create(ctor.prototype);
这样子写其实也行,但是最后看结果的时候,你会发现多了一层,这一层就是ctor。
总结
核心就是三步,空对象继承链,执行,判断。