我有一个课程Foo
,想要创建一个函数FooPrime
,它等同于调用new Foo()
并将参数传递给FooPrime
;
换句话说,如果我这样做:
FooPrime(1, 2, 3);
它应该与调用:
相同new Foo(1, 2, 3)
通常我会使用call
或apply
来做这类事情,使用apply可以获得几乎相同的效果:
var FooPrime = function() {
return Foo.apply({}, arguments);
}
然而:
Foo.apply({}, [1, 2, 3]);
与调用不完全相同:
new Foo(1, 2, 3)
所以我的问题是,有没有办法制作一个与<{1>} 完全相同的函数,并且有任意数量的参数?
答案 0 :(得分:4)
在ECMAScript 5中,您可以使用以下内容填充[[Construct]]:
function isObject(o) {
return Object(o) === o;
}
function construct(F, args) {
var obj = isObject(F.prototype) ? Object.create(Foo.prototype) : {},
res = Function.prototype.apply.call(F, obj, args);
return isObject(res) ? res : obj;
}
var FooPrime = function() {
return construct(Foo, arguments);
}
ECMAScript 6提供了更简单,更可靠的Reflect.construct
var FooPrime = function() {
return Reflect.construct(Foo, arguments);
}
或者您也可以使用spread operator,其浏览器支持率高于Reflect
。
var FooPrime = function() {
return new Foo(...arguments);
}