为什么在原型链中使用下划线别名方法?

时间:2014-06-22 22:23:42

标签: javascript underscore.js

然后使用call()调用它们?

例如,切片可以直接调用

obj.slice(1);

但是下划线

slice.call(obj, 1);

这是什么原因?

2 个答案:

答案 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 }