Error} [返回结果]
*/
function mockNew() {
// 创建一个空对象
let emptyObj = new Object();
// 取传入的第一个参数,即构造函数,并删除第一个参数。
// 关于为什么要用 Array.prototype.shift.call 的形式,见之前的博客文章 《JavaScript之arguments》
let constructor = Array.prototype.shift.call(arguments);
// 类型判断,错误处理
if(typeof constructor !== "function") {
throw("构造函数第一个参数应为函数");
}
// 绑定 constructor 属性
emptyObj.constructor = constructor;
// 关联 __proto__ 到 constructor.prototype
emptyObj.__proto__ = constructor.prototype;
// 将构造函数的 this 指向返回的对象
let resultObj = constructor.apply(emptyObj, arguments);
// 返回类型判断, 如果是对象,则返回构造函数返回的对象
if (typeof resultObj === "object") {
return resultObj
}
// 返回对象
return emptyObj;
}
function Person(name) {
this.name = name;
return {
name: this.name,
age: 40
}
}
var person = mockNew(Person, "jayChou");
console.log(person);
// {name: "jayChou", age: 40}
// age: 40
// name: "jayChou"
// __proto__: Object
当返回值返回了一个自定义对象后,模拟 new 函数就返回该自定义对象。
总结
JavaScript new 关键字的意义在于让普通函数生成一个新对象,并将对象实例的 __proto__
关联到函数的 prototype 对象。
本文中有些地方需要一些前置知识,但是总体上理解是比较容易的。
以上就是JavaScript如何模拟实现new关键字?(附代码)的详细内容,更多请关注php中文网其它相关文章!
网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。
关键词:JavaScript如何模拟完成new关键字?(附代码)