JavaScript: 为什么要使用原型来调用函数而不只是直接调用函数?

3
为什么要这样切割数组:
Array.prototype.slice.call(arr, 3);

不要只是:

arr.slice(3);

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

谢谢!


1
'arr' 可能不是一个真正的数组。它可能是一个 NodeList 或者一个 arguments 参数,因此 slice 方法不可用。 - Joe Simmons
1个回答

6
主要好处在于,“arr”不是数组,而是类似数组的东西;具体来说,是带有“length”属性和数值键属性的东西。好的例子是来自DOM的“arguments”对象和NodeList对象。这些东西没有“slice”方法,但它们确实有数值键属性和“length”属性。
这个技巧之所以有效,是因为“slice”方法非常宽容。
如果你看到它被用于已经是数组的东西,那么你正在看一个迷惑的人写的代码:)
哦,还要注意一个快捷方式:
var foo = [].slice.call(arguments, 0);

如果你不想直接访问原型,也可以从数组实例中轻松地访问它。这样做虽然需要进行虚拟分配,但在现代技术环境下,我不会感到惊讶,如果虚拟机已经对此进行了优化。


谢谢!这很有帮助。所以,为了确保我理解正确:使用原型/调用方法允许您在不属于给定类型的其他对象上使用对象的原型方法? - Mr Mikkél
1
@MrA 是的 - 但是:它只有在它起作用时才有效。换句话说,这个技巧让你可以访问一个方法并调用它,使得this是你选择的某个对象。这个方法会工作吗?嗯,也许会,也可能不会。在这种情况下,它确实有效。 - Pointy
适用于任何对象的方法在规范中被记录为通用方法。您可以直接复制对它们的引用,以避免创建自己的实现。例如:List.prototype.add = Array.prototype.pushNodeList.prototype.each = Array.prototype.forEach - Esailija

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接