gpt4 book ai didi

javascript - 在javascript中创建对象时动态控制参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:25:31 25 4
gpt4 key购买 nike

我在 javascript 中有多个 eatable 类,例如:食物、饮料、零食。这个类中的每一个都需要一组不同的参数。我有另一个工厂类,它创建发送给它的可食用元素的实例。

我无法弄清楚我们如何使用这个工厂动态选择可食用的项目并传递参数(以数组形式)?

我想出了两个解决方案 -解决方案一:

var factory = function(eatable, argumentList){
var obj = new eatable(argumentList);
return obj
};

这是一个问题,因为 argumentList 是一个数组。

方案二

var factory = function(eatable, argumentList){
var obj = eatable.apply({}, argumentList);
return obj
};

这并没有真正创建可食用类型的对象。

我真正想要的效果假设我能够将 argumentList 转换为 js 参数类型对象然后 -

var obj = new eatable(argumentList.toArguments());
obj instanceOf eatable; // should return true

请帮忙!

最佳答案

啊,是的。我以前遇到过这个问题-你can't use new and apply together在 JavaScript 中。之前有人问过类似的问题:Use of .apply() with 'new' operator. Is this possible?

问题很明显——new 是关键字,不是函数;并且 apply 只能用在一个函数上。如果 new 是一个函数而不是 关键字,那么我们可以将它与 apply 结合使用。

为了理解如何做到这一点,让我们创建一个名为 new 的函数,它的作用与关键字 new 的作用完全相同:

Function.prototype.new = (function () {
function Factory(constructor, args) {
return constructor.apply(this, args);
}

return function() {
Factory.prototype = this.prototype;
return new Factory(this, arguments);
};
}());

现在不再像下面这样调用构造函数了:

var object = new constructor(arg1, ...);

您可以按如下方式调用构造函数:

var object = constructor.new(arg1, ...);

你问这样做有什么好处?好吧,这真的很简单。因为 new 现在是一个函数而不是关键字,您可以将它与 apply 结合使用,如下所示:

var object = Function.new.apply(constructor, [arg1, ...]);

因此,您的 eatable 工厂函数现在变为:

var factory = function(eatable, argumentList) {
var obj = Function.new.apply(eatable, argumentList);
return obj;
};

编辑:如果您的工厂函数所做的只是获取一个eatable 构造函数和一个argumentList 并返回new.apply(eatable , argumentList) 那么正如 Bergi 在他的评论中指出的那样,您可以改为如下定义 factory :

var factory = Function.apply.bind(Function.new);

希望这对您有所帮助。

关于javascript - 在javascript中创建对象时动态控制参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17342497/

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