我正在阅读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)));
任何帮助将不胜感激, 感谢
答案 0 :(得分:5)
从内到外做到这一点:
Array.prototype.slice.apply(arguments)
---将arguments
类似数组的对象转换为实数组[this.length,0].concat(#1)
---将硬编码的[this.length,0]
数组与#1 this.splice.apply(this, #2)
---将this.splice
函数应用于this
对象,其参数来自#2 最后它看起来像: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)
;