使用“新”运算符扩展 .apply() 的功能
在 JavaScript 中,.apply() 方法允许使用函数使用指定的对象上下文和作为数组传递的参数进行调用。然而,问题出现了:.apply() 可以与“new”运算符结合使用来创建对象实例吗?
您提供的初始代码片段尝试执行此操作,但不幸的是,这种方法是JavaScript 本身不支持。
但是,已经提出了几种巧妙的解决方案来克服此限制。一种特别优雅的方法是在 ECMAScript5 中使用 Function.prototype.bind:
function newCall(Cls) { return new (Function.prototype.bind.apply(Cls, arguments)); }
此函数接受类或构造函数作为其第一个参数,以及应传递给构造函数的任何其他参数。然后,它使用 Function.prototype.bind 创建一个新函数,该函数具有与构造函数相同的上下文以及预绑定的附加参数。最后,“new”关键字用于基于此绑定函数创建一个新的对象实例。
另一种可能的解决方案涉及使用 eval() 函数:
function evalConstructor(str, args) { return eval('new (' + str + ')(' + args + ')'); }
此函数采用表示构造函数和参数数组的字符串表达式,然后将该字符串计算为 JavaScript 表达式。生成的代码本质上与直接使用 new 运算符相同,但它允许您传递可变数量的参数。
这些解决方案提供了创建具有可变数量参数的对象实例的便捷方法,从而增强了JavaScript 构造函数机制的功能。
以上是`.apply()` 可以与 `new` 运算符一起使用来创建 JavaScript 对象吗?的详细内容。更多信息请关注PHP中文网其他相关文章!