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
答案
从这里的回答中,可以清楚地看到没有内置的方法可以使用 .apply()
和 new
操作符一起调用。然而,有人提供了一些非常有趣的解决方案。
我倾向于使用Matthew Crumley的这个解决方案(我已经修改过以传递arguments
属性):
var createSomething = (function() {
function F(args) {
return Something.apply(this, args);
}
F.prototype = Something.prototype;
return function() {
return new F(arguments);
}
})();
new
有两个作用:(i) 设置原型, (ii) 将构造器应用于具有“this”设置为该对象/原型组合的对象。您可以通过使用Object.create()
或通过自己扩展Object.create()
并使用闭包捕获上下文来实现这一点。 - Dmitry Minkovskyspread
运算符。 =)在Chrome中它也稍微快一点:http://jsperf.com/dynamic-arguments-to-the-constructor - Sergey Kamardinvar s = new Something(a,b,c)
吗?我不明白 :/ - through.a.haze