首页 >web前端 >js教程 >JavaScript 的 new 运算符可以与 .apply() 方法一起使用吗?

JavaScript 的 new 运算符可以与 .apply() 方法一起使用吗?

Barbara Streisand
Barbara Streisand原创
2024-12-17 09:31:25352浏览

Can JavaScript's `new` Operator Work with the `.apply()` Method?

.apply() 方法可以与 new 运算符一起使用吗?

在 JavaScript 中,通常使用 new 运算符创建对象实例涉及显式地将参数传递给构造函数。但是,可能需要传递可变数量的参数。本问题探讨了结合使用 .apply() 方法和 new 运算符来实现这种灵活性的可能性。

挑战

最初,人们可能会尝试以下代码:

function Something() {
    // init stuff
}
function createSomething() {
    return new Something.apply(null, arguments);
}
var s = createSomething(a, b, c); // 's' is an instance of Something

但是,这种方法不起作用,因为 new 运算符与 .apply() 不兼容

解决方案

已经提出了各种解决方案来克服此限制:

1. Matthew Crumley 的方法

此解决方案采用从目标构造函数继承的中间函数:

var createSomething = (function() {
    function F(args) {
        return Something.apply(this, args);
    }
    F.prototype = Something.prototype;

    return function() {
        return new F(arguments);
    }
})();

2。 Function.prototype.bind

ECMAScript5 引入了 Function.prototype.bind 方法,该方法允许部分应用函数:

function newCall(Cls) {
    return new (Function.prototype.bind.apply(Cls, arguments));
}

可以按如下方式使用:

var s = newCall(Something, a, b, c);

使用优点Function.prototype.bind

这种方法有几个优点:

  • 它适用于所有构造函数,包括像 Date 这样的特殊构造函数。
  • 它可以是使用简洁,直接将参数传递给new。
  • 它保留了原始构造函数的prototype.

说明

Function.prototype.bind 创建一个继承原始函数属性的新函数。通过部分应用带有所需参数的构造函数,我们可以使用 new 关键字创建一个实例。

以上是JavaScript 的 new 运算符可以与 .apply() 方法一起使用吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn