在 JavaScript 中,apply() 方法允许将任意数量的参数作为数组传递到预定义的函数,可能会扩展其功能。然而,当与对象实例化所必需的 new 运算符结合使用时,这种方法提出了一个独特的挑战:构造函数通常需要固定数量的参数。
我的问题源于创建对象实例的愿望使用 new 运算符,同时动态地向构造函数提供参数。
障碍:
最初,我试图实现这个概念:
function Something(){ // Initializations } function createSomething(){ return new Something.apply(null, arguments); } var s = createSomething(a,b,c); //'s' is an instance of Something
然而,事实证明这种方法无效。
解决问题:
提出了许多解决方案响应我的查询,但没有提供 apply() 与 new 运算符的无缝集成。我们提出了替代解决方案,每个方案都有自己的优点和注意事项。
首选解决方案:
Matthew Crumley 提出的最能引起我共鸣的解决方案采用了一种巧妙的方法使用 Function.prototype.bind 和中间函数的方法:
var createSomething = (function() { function F(args) { return Something.apply(this, args); } F.prototype = Something.prototype; return function() { return new F(arguments); } })();
这种方法避开apply() 并使用一个单独的函数 F,它实现了预期的功能。
另一个可行的选项:
Simon Lyall 提供的另一个值得注意的解决方案利用了 Function .prototype.bind 和 eval():
function createSomething(){ var args = [].slice.call(arguments), constr = eval("new ("+Something.name+"(" + args+ "))"); return constr; }
虽然优雅简洁,但这种方法依赖于eval(),这可能会引起对不同环境之间的安全性和兼容性的担忧。
结论:
尽管 apply() 方法提供了一种强大的方法来处理动态由于参数数量较多,JavaScript 中仍然不支持与 new 运算符的直接集成。相反,可以使用替代解决方案来实现类似的功能,从而允许使用不同的参数灵活创建对象实例。
以上是如何在 JavaScript 中使用'new”运算符动态地将参数传递给构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!