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

使用变量参数创建新的Javascript对象,javascript,Javascript,我有一个类Foo,想创建一个函数FooPrime,它相当于调用newfoo(),并将参数传递给FooPrime 换句话说,如果我这样做: FooPrime(1, 2, 3); 它应该与调用以下对象相同: new Foo(1, 2, 3) 通常我会使用call或apply来处理这类事情,我可以使用apply获得几乎相同的效果: var FooPrime = function() { return Foo.apply({}, arguments); } 然而: Foo.apply({}

我有一个类
Foo
,想创建一个函数
FooPrime
,它相当于调用
newfoo()
,并将参数传递给
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)

因此,我的问题是,有没有办法制作一个与
new
功能完全相同的函数,并且具有任意数量的参数?

在ECMAScript 5中,您可以使用如下内容进行多边形填充:

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
具有更多的浏览器支持

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

在ECMAScript 5中,可以使用如下内容进行多边形填充:

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
具有更多的浏览器支持

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

new(Function.prototype.bind.apply(Foo[null].concat(argsArray))()(借用自)
新建(Function.prototype.bind.apply(Foo[null].concat(argsArray))
(借用自)这很完美,但不幸的是,它不适用于es6类,即
class Foo
(它给出
TypeError:class构造函数不能在没有“new”的情况下调用
)。es6类是否有一个等价物(但没有使用Reflect,因为Chrome目前不支持它)?@MachineHost您可以使用扩展运算符:
new Foo(…arguments)
,这很完美,但不幸的是它不适用于es6类,即
class Foo
(它给出了
TypeError:Class构造函数不能在没有“new”的情况下调用。
)。es6类是否有一个等价的类(但没有使用Reflect,因为Chrome目前不支持它)?@machineghost您可以使用扩展运算符:
new Foo(…参数)