Javascript好的部分:无法理解方法array.push

时间:2014-11-13 03:00:27

标签: javascript

我正在阅读Douglas Crockford的Javascript好的部分,但我不能理解第8章“方法”中 Array.push 的实现,如下所示:

Function.prototype.method = function(name,func){
    if(!this.prototype[name]){
        this.prototype[name] = func;
    }
};

Array.method('mypush',function(){
    this.splice.apply(this,[this.length,0].concat(Array.prototype.slice.apply(arguments)));

    return this.length;
});

var arr = [1,2,3];
arr.mypush(2,3);
console.log(arr);

我无法理解这句话:

this.splice.apply(this,[this.length,0].concat(Array.prototype.slice.apply(arguments)));

任何帮助将不胜感激, 感谢

2 个答案:

答案 0 :(得分:5)

从内到外做到这一点:

  1. Array.prototype.slice.apply(arguments) ---将arguments类似数组的对象转换为实数组
  2. [this.length,0].concat(#1) ---将硬编码的[this.length,0]数组与#1
  3. 中的数组连接起来
  4. this.splice.apply(this, #2) ---将this.splice函数应用于this对象,其参数来自#2
  5. 最后它看起来像:this.splice(this.length, 0, arg1, arg2, arg3)这意味着:在等于this.length的索引处(请参阅"在最后)替换0元素(请参阅 - don&# 39; t删除任何东西)用给定的参数。

    参考文献:

答案 1 :(得分:1)

apply接受一个函数,并在提供的this对象和从数组中获取的参数上调用它。

this.splice.apply(this,[this.length,0].concat(Array.prototype.slice.apply(arguments)));

所以,我们在这里有:

this.splice        // a reference to the function "splice" that an Array has

this.splice.apply  // invoke this function 

this.splice.apply(this   // invoke it on "this" 

this.splice.apply(this,[     // with an array of parameters

    [this.length,0]   // the first two parameters are "the length", and a "0"

    // calling splice this way means replacing the 0 elements 
    // after the end of the array with the following new elements
    // => i.e. pushing the new elements 

    ].concat     // but we add some more parameters

    Array.prototype.slice.apply(arguments)    
        // namely the arguments passed into this function

最后一步是必要的,因为arguments不是真正的数组,所以它不适用于concat。 slice复制它(进入一个真正的数组)。

总结一下这个例子。

如果您致电[1,2,3].mypush(2,3),则会转换为[1,2,3].splice(3, 0, 2, 3);