JavaScript - 函数构造函数在没有' new'关键词

时间:2014-11-23 04:37:29

标签: javascript function oop constructor new-operator

我们都知道在没有'new'关键字的情况下调用JavaScript构造函数是很糟糕的。 那么为什么呢:

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

返回与此相同的值?:

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

在这个例子中省略'new'关键字是否有任何伤害(或好处)?

2 个答案:

答案 0 :(得分:4)

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

来自MDN page on the Function constructor

  

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

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

答案 1 :(得分:0)

没有。如果没有Function关键字,调用new确实没有坏处。事实上,我建议尽可能不要在您的计划中使用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"]);

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

希望有所帮助。