gpt4 book ai didi

javascript - 试图模拟 'new' 运算符

转载 作者:行者123 更新时间:2023-11-30 20:37:16 25 4
gpt4 key购买 nike

如何使用 myNew 函数模拟“new”运算符?什么都试过了,但我无法让它工作。

function Person(name) {
this.name = name;
}

Person.prototype.getName = function() {
return this.name;
}

function myNew(){
var obj = Object.create(Object.prototype);
var instance = this.apply(obj, arguments);
return instance;
}


var person = myNew(Person, 'Test');
console.log(person instanceof Person); // true
person.getName(); // Test

最佳答案

如果你想要一个没有 Reflect.construct 的模拟,试试这个:

function myNew(constructor) {
var instance = Object.create(constructor.prototype)
var args = Array.from(arguments)
args.shift()
constructor.apply(instance, args)
return instance
}

如果你支持ES6,你可以把它写得更短:

function myNew(constructor, ...args) {
var instance = Object.create(constructor.prototype)
constructor.apply(instance, args)
return instance
}

编辑:刚刚注意到 Array.from 在 ES6 中可用,但如果你想支持 ES5,你可以很容易地模拟它

编辑 2:展望MDN在 new 运算符的页面上,我注意到我忘记了从构造函数创建对象的一个​​重要步骤。我使用的算法与页面上解释的算法几乎相同,除了关键部分,有些构造函数实际上返回了一些东西(并非所有构造函数都返回 undefined)。在这种情况下,返回的对象新表达式的求值。所以函数的最终形式(我希望)将是

function myNew(constructor, ...args) {
var instance = Object.create(constructor.prototype)
var obj = constructor.apply(instance, args)
if(obj instanceof Object) return obj
return instance
}

关于javascript - 试图模拟 'new' 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49689964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com