【发布时间】:2014-03-26 16:35:34
【问题描述】:
我试图弄清楚如何使用任意数量的参数调用构造函数(从其他函数调用传递参数)。
我在 javascript 中有一组基础对象和派生对象。基础对象上的方法之一称为makeNew(),它的工作是创建一个与调用它的任何对象具有相同类型的新对象,并处理与普通构造函数在新对象上处理的所有相同参数。这个makeNew() 方法的要点是,还有其他方法想要创建一个与当前对象相同类型的新对象,但他们不知道那是什么类型,因为它可能是继承自基类。请注意,我不想要当前对象的完整克隆,而是想要一个相同类型的新对象,但使用构造函数的不同初始参数进行初始化。
makeNew() 的简单版本是这样的:
set.prototype.makeNew = function() {
return new this.constructor();
}
这适用于创建与当前对象类型相同的空对象,因为如果它是继承的对象类型,那么this.constructor 将是继承的构造函数,它将生成正确的对象类型。
但是,当我想将任意参数传递给构造函数以便普通的构造函数参数可以传递给makeNew() 时,我不知道该怎么做。我试过这个:
set.prototype.makeNew = function() {
return new this.constructor.apply(this, arguments);
}
但是,该代码在 Chrome 中给了我这个错误:
Error: function apply() { [native code] } is not a constructor
知道如何将任意参数传递给构造函数吗?
【问题讨论】:
-
我不明白第一个版本有什么问题。
return new this.constructor(arguments);应该可以工作。 -
@TastySpaceApple - 将单个参数传递给构造函数,该参数是单个类似数组的对象,这不是构造函数期望传递其多个参数的方式。
-
@cookiemonster - 我将不得不在您引用的帖子中尝试该技术。这是一个有趣的 hack。
-
如果你的意思是带有
F临时构造函数的那些,那基本上就是Object.create()(部分)垫片。 -
@cookiemonster - 我不喜欢您发布的链接的一件事是,它给您留下了一个名为“F”的对象,乍一看实际上不会导致编程问题,但是在通常创建的对象的基础上创建了额外的继承级别。它仍然是一个 hack,而不是一个完全干净的解决方案。仅供参考,我在这里对其进行了测试:jsfiddle.net/jfriend00/rXyXJ