为什么我们需要在构造函数中使用apply方法来调用原型对象上定义的任何方法?

时间:2012-12-31 12:31:23

标签: javascript

为什么我们需要在构造函数中使用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?

enter image description here

1 个答案:

答案 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],而中间没有额外的数组。