首页 > web前端 > js教程 > 如何在 JavaScript 中使用'new”运算符动态地将参数传递给构造函数?

如何在 JavaScript 中使用'new”运算符动态地将参数传递给构造函数?

Mary-Kate Olsen
发布: 2024-12-04 10:58:11
原创
1004 人浏览过

How Can I Dynamically Pass Arguments to a Constructor Using the `new` Operator in JavaScript?

使用新运算符克服 Apply() 方法的限制

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板