然后使用call()
调用它们?
例如,切片可以直接调用
obj.slice(1);
但是下划线
slice.call(obj, 1);
这是什么原因?
答案 0 :(得分:1)
如果obj.slice
不是您认为的那样。
特别是像arguments
或NodeLists这样的类似数组的对象没有slice
方法。
答案 1 :(得分:0)
我对下划线没有多少经验,但我认为这是由于使用数组对象而不是数组的下划线。
在这种情况下,它没有数组的方法,所以你必须使用call方法。
见下面的例子:
function List(){
this.length = arguments.length;
//arguments is an array like object, not an array, does not have a foreach method
Array.prototype.forEach.call(arguments, function(val, index){
this[index] = val;
}, this);
}
var list = new List(1,2,3,4,5);
console.log(list); //{ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, length: 5 }
//Cannot use push on on object List
//list.push(6); //TypeError: undefined is not a function
//But you can use call()
Array.prototype.push.call(list, 6);
console.log(list);
//{ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6, length: 6 }
http://repl.it/UZX链接到上面的示例
编辑:我错过了重要的事情。
您看到的切片实现是通过设置var slice = Array.prototype.slice
slice.call()
以便切片方法具有要引用的此变量。
查看以下示例:
var push = Array.prototype.push;
push.call(list, 7);
console.log(list);
//{ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6, '6': 7, length: 7 }
List.prototype.push = push;
list.push(8);
console.log(list);
//{ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6, '6': 7, '7': 8, length: 8 }