gpt4 book ai didi

带有可选参数的 JavaScript 工厂

转载 作者:搜寻专家 更新时间:2023-11-01 04:51:16 27 4
gpt4 key购买 nike

问题是我需要为传递的类创建一个新实例

有没有办法重写这个函数,让它可以接受任意数量的参数?

function createInstance(ofClass, arg1, arg2, arg3, ..., argN){
return new ofClass(arg1, arg2, arg3, ..., argN);
}

此函数应创建所传递类的实例。示例:

var SomeClass = function(arg1, arg2, arg3){
this.someAttr = arg3;
.....
}
SomeClass.prototype.method = function(){}

var instance = createInstance(SomeClass, 'arg1', 'arg2', 'arg3');

所以这应该是真的。

instance instanceof SomeClass == true  

现在,我只是将 N 限制为 25,希望很少使用更多参数。

最佳答案

其他答案都在正确的轨道上,但没有一个提到你必须意识到 arguments不是 Array。它是一种特殊的结构,其行为类似于 Array

所以在你像数组一样使用它之前,你可以把它转换成这样:

function createInstance(cls) {
// This will use the slice function of the Array type, effectively converting
// the arguments structure to an Array and throwing away the first argument,
// which is cls.
var args = Array.prototype.slice.call(arguments, 1);
return cls.apply(this, args);
}

抱歉,我只是用constructor等复制了代码,并没有想过它到底会做什么。我现在已经将其更新为您想要的。您会发现它在 without new 的情况下调用构造函数,因此您不会得到相同的行为。然而,John Resig(jQuery 的作者)wrote on this very issue .

根据 John Resig 的文章,您有两种解决方法。更精细的解决方案对用户来说是最透明的,但选择哪种解决方案取决于您。


如果您只打算支持具有 Object.create 功能的浏览器(与三年前相比,现在的比例相当大),这是一个“完美”的解决方案:

function createInstance(cls) {
var obj = Object.create(cls.prototype);

var args = Array.prototype.slice.call(arguments, 1);
cls.apply(obj, args);

return obj;
}

new cls(x)createInstance(cls, x) 生成的对象应该相同。

关于带有可选参数的 JavaScript 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271657/

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