JavaScript:为什么要使用prototype来调用函数,而不仅仅是调用函数?

JavaScript:为什么要使用prototype来调用函数,而不仅仅是调用函数?,javascript,arrays,prototype,slice,Javascript,Arrays,Prototype,Slice,为什么要像这样分割阵列: Array.prototype.slice.call(arr, 3); 而不是简单地: arr.slice(3); ? 使用原型和调用的好处是什么 谢谢 当“arr”不是一个数组,而是一个类似数组的东西时,关键的好处就实现了;具体来说,具有“长度”属性和数字键控属性的对象。很好的例子是来自DOM的参数对象和节点列表对象。这些东西没有“切片”方法,但它们有数字键控属性和“长度”属性 这个技巧之所以有效,是因为“切片”方法非常宽容 如果您看到它被用于肯定已经是数组的东西

为什么要像这样分割阵列:

Array.prototype.slice.call(arr, 3);
而不是简单地:

arr.slice(3);
?

使用原型和调用的好处是什么


谢谢

当“arr”不是一个数组,而是一个类似数组的东西时,关键的好处就实现了;具体来说,具有“长度”属性和数字键控属性的对象。很好的例子是来自DOM的
参数
对象和节点列表对象。这些东西没有“切片”方法,但它们有数字键控属性和“长度”属性

这个技巧之所以有效,是因为“切片”方法非常宽容

如果您看到它被用于肯定已经是数组的东西,那么您看到的是一个困惑的人编写的代码:)

哦,还要注意一条捷径是:

var foo = [].slice.call(arguments, 0);

如果你不想,你不必直接去原型那里;您也可以从阵列实例轻松地获得它。(是的,这需要虚拟分配,但在今天这个时代,如果虚拟机优化了它,我不会感到惊讶。)

LOL。谢谢!这很有帮助。因此,为了确保我理解:使用prototype/call方法允许您在非给定类型的其他对象上使用对象的prototype方法?@MrA是-但是:它只有在有效时才有效。换句话说,这个技巧让你找到一个方法并调用它,这样
this
就是你选择的某个对象。这种方法有效吗?嗯,也许吧,也许不。在本例中是这样的。对任何对象起作用的方法都作为通用方法记录在规范中。您可以直接复制对它们的引用,以避免创建自己的实现。例如,
List.prototype.add=Array.prototype.push
。或者
NodeList.prototype.each=Array.prototype.forEach
“arr”可能不是实际的数组。它可能是节点列表或参数,因此slice方法不可用。