我们都知道在没有'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'关键字是否有任何伤害(或好处)?
答案 0 :(得分:4)
Function
构造函数创建一个新函数,无论您是否使用new
调用它。这就是它的编写方式。如果需要,可以用这种方式编写构造函数。
来自MDN page on the Function constructor:
将Function构造函数作为函数调用(不使用new operator)与将其作为构造函数调用具有相同的效果。
使用或不使用new
运算符与Function
构造函数没有任何伤害或好处,甚至没有任何区别。
答案 1 :(得分:0)
没有。如果没有Function
关键字,调用new
确实没有坏处。事实上,我建议尽可能不要在您的计划中使用new
:stop 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"]);
如果您事先不知道希望函数有多少参数,这将非常有用。
希望有所帮助。