为什么我们需要在构造函数中使用apply方法来调用原型对象上定义的任何方法?
代码工作:
function Test(){
this.x = [];
this.add.apply(this,arguments);
}
Test.prototype.add = function(){
for(var i=0; i < arguments.length; i++){
this.x.push(arguments[i]);
}
}
var t = new Test(11,12)
t.x //[11,12] this is fine
t.x.length //2 this is also fine
但是当我直接调用添加内部构造函数
时代码无效:
function Test(){
this.x = [];
this.add(arguments);
}
Test.prototype.add = function(){
for(var i=0; i < arguments.length; i++){
this.x.push(arguments[i]);
}
}
var t = new Test(11,12);
t.x.length; //1 Not added all elements why?
答案 0 :(得分:4)
这与原型没有任何关系,它与apply
如何获取数组有关,然后使用这些值作为函数的参数来调用。在这种情况下,如果你这样做
this.add(arguments);
正是这样做的。使用第一个参数调用add是一个类似于数组的对象,最后x是一个数组,其中第一个元素是一个数组。 new Test(1, 2, 3)
将导致x = [ [1, 2, 3] ]
(内部数组实际上是一个Arguments对象,但它类似于一个数组)。但是,如果你这样做
this.add.apply(this, arguments);
它基本上正在做
this.add(arguments[0], arguments[1], arguments[2], ...);
这样,x最终成为这些元素的数组,而不是数组中的数组。即,使用new Test(1, 2, 3)
,您将获得x = [1, 2, 3]
,而中间没有额外的数组。