Error} [返回结果]
*/
function mockNew() {
// 创建一个空对象
let resultObj = new Object();
// 取传入的第一个参数,即构造函数,并删除第一个参数。
let constructor = Array.prototype.shift.call(arguments);
// 类型判断,错误处理
if(typeof constructor !== "function") {
throw("构造函数第一个参数应为函数");
}
// 绑定 constructor 属性
resultObj.constructor = constructor;
// 关联 __proto__ 到 constructor.prototype
resultObj.__proto__ = constructor.prototype;
// 将构造函数的 this 指向返回的对象
constructor.apply(resultObj, arguments);
// 返回对象
return resultObj;
}
function Person(name) {
this.name = name;
}
var person = mockNew(Person, "jayChou");
console.log(person);
// constructor: ? Person(name)
// name: "jayChou"
// __proto__: Object
基本思路正确! 所以我们完成了 new 关键字的初步模拟。伙伴们可以自己动手敲一下,每句代码自己是否都能理解。
二、处理返回值
构造函数也是函数,有不同类型返回值。有时候构造函数会返回指定的对象内容,所以要对这部分进行处理。
/**
* 模拟实现 JavaScript new 操作符
* @param {Function} constructor [构造函数]
* @return {Object 关键词:JavaScript如何模拟完成new关键字?(附代码)