【问题标题】:JavaScript - Function constructor works without the 'new' keyword [duplicate]JavaScript - 函数构造函数在没有'new'关键字的情况下工作[重复]
【发布时间】:2015-01-21 00:47:39
【问题描述】:

我们都知道在没有“new”关键字的情况下调用 JavaScript 构造函数是不好的。 那么为什么会这样:

Function("a", "b", "return a + b")(1, 1); // returns "2"

返回与此相同的值?:

new Function("a", "b", "return a + b")(1, 1); // Also returns "2"

在这种情况下省略“新”关键字有什么坏处(或好处)吗?

【问题讨论】:

  • @Qantas94Heavy 这不是重复的,因为链接问题中没有提到 Function 构造函数。
  • @Qantas94Heavy 不,我对保持这个问题的开放没有既得利益。我可以立即结束这个问题。但是,我确实相信这确实是一个新问题,因为它解决了链接问题没有解决的问题。对于在 StackOverflow 上寻找答案的人来说,没有什么比必须遵循重复链接然后发现他们必须自己推断答案更烦人的了。只要是新的就可以有重复:blog.stackoverflow.com/2010/11/…

标签: javascript function oop constructor new-operator


【解决方案1】:

Function 构造函数会创建一个新函数,无论您是否使用 new 调用它。就是这样写的。如果需要,可以这样编写构造函数。

来自MDN page on the Function constructor

将 Function 构造函数作为函数调用(不使用 new operator) 与作为构造函数调用它的效果相同。

new 运算符与Function 构造函数一起使用没有任何害处或好处,甚至没有任何区别。

【讨论】:

    【解决方案2】:

    没有。在没有new 关键字的情况下调用Function 确实没有什么坏处。事实上,我建议不要在你的程序中尽可能使用newstop using the new keyword

    创建一个new 函数会更好:

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

    这样做的好处是现在您可以按如下方式创建实例:

    function Foo(a, b) {
        this.a = a;
        this.b = b;
    }
    
    var foo = Foo.new(1, 2);
    
    // instead of
    
    var foo = new Foo(1, 2);
    

    有什么意义?关键是您现在可以执行以下操作:

    var foo = Foo.new.apply(Foo, [1, 2]);
    

    因为new 是一个函数,您可以对其执行操作,例如将其应用于参数数组等。您不能使用new 关键字执行相同操作。

    无论如何,回到手头的主题,Function 构造函数可以使用或不使用new 关键字来调用。它没有任何区别。因此,我建议您根本不要使用 new 关键字。它不仅可以为您节省一些击键次数,而且还可以用于以下用途:

    Function.apply(null, ["a", "b", "return a + b"]);
    

    如果您事先不知道希望函数有多少个参数,这将特别有用。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多