使用变量参数创建新的Javascript对象

时间:2016-03-14 02:12:21

标签: javascript

我有一个课程Foo,想要创建一个函数FooPrime,它等同于调用new Foo()并将参数传递给FooPrime;

换句话说,如果我这样做:

FooPrime(1, 2, 3);

它应该与调用:

相同
new Foo(1, 2, 3)

通常我会使用callapply来做这类事情,使用apply可以获得几乎相同的效果:

var FooPrime = function() {
    return Foo.apply({}, arguments);
}

然而:

Foo.apply({}, [1, 2, 3]);

与调用不完全相同:

new Foo(1, 2, 3)

所以我的问题是,有没有办法制作一个与<{1>} 完全相同的函数,并且有任意数量的参数?

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);
}