这个Array切片调用中的原型,为什么?

Ste*_*dge 8 javascript prototype-programming

我正在阅读JS Function的arguments变量的MDN页面:

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments

我知道参数不是数组,所以这不起作用:

var a = arguments.slice();
Run Code Online (Sandbox Code Playgroud)

MDN上的解决方案是这样做的:

var args = Array.prototype.slice.call(arguments);
Run Code Online (Sandbox Code Playgroud)

为什么使用Array.prototype而不仅仅是Array.slice.call(arguments)?在这里使用原型显着吗?

CMS*_*CMS 7

为什么使用Array.prototype而不仅仅是Array.slice.call(arguments)?

该Array.slice方法是Array和String Generics的一部分,这是一组作为和构造函数的属性实现的"静态"方法.ArrayString

这些方法是非标准的,它们仅在基于Mozilla的实现中可用.

我已经看到这些方法和标准方法之间存在很多混淆,但是如果你测试的话,你应该知道它们不一样.

Array.slice === Array.prototype.slice; // false
Run Code Online (Sandbox Code Playgroud)

你会发现它们是不同的方法.

顺便说一句,如果您使用该方法,则不需要使用该call方法,第一个参数是将用作thisvalue(Array.slice(arguments))的对象.

在这里使用原型显着吗?

是的,Array构造函数只是一个函数,标准slice方法,以及所有其他"数组方法"的定义Array.prototype.

此对象Array.prototype是所有Array对象实例继承的对象.

正如@Pointy所说,您可以使用Array实例获取对该方法的引用:

 [].slice === Array.prototype.slice; // true
Run Code Online (Sandbox Code Playgroud)

理论上,这将创建一个新的Array对象,并slice在原型链中访问该方法,但我记得有些实现正在开始优化这种属性访问,避免创建一次性对象,所以,在某些这一点,在性能方面也是完全相同的.