JavaScript 模拟 new 实现
作者:Seiya
时间:2019年08月12日
new
操作符
new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:
创建一个空的简单 JavaScript 对象即 {};
链接该对象(即设置该对象的构造函数)到另一个对象;
将步骤 1 新创建的对象作为 this 的上下文;
如果该函数没有返回对象,则返回 this;
模拟实现
function New(func) {
var res = {};
/* 绑定 prototype */
if (func.prototype !== null) {
res.__proto__ = func.prototype;
}
var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
/* 判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象 */
if ((typeof ret === 'object' || typeof ret === 'function') && ret !== null) {
return ret;
}
return res;
}
也可以通过如下方式实现:
function objectFactory() {
var obj = new Object();
/* 获取第一个参数,并绑定 prototype */
Constructor = [].shift.call(arguments);
obj.__proto__ = Constructor.prototype;
var ret = Constructor.apply(obj, arguments);
return typeof ret === 'object' ? ret : obj;
}