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

时间:2011-07-20 14:30:32

标签: javascript prototype-programming

我正在阅读JS函数的参数变量的MDN页面:

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

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

var a = arguments.slice();

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

var args = Array.prototype.slice.call(arguments);

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

5 个答案:

答案 0 :(得分:7)

  

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

Array.slice方法是Array and String Generics的一部分,@Pointy是一组“静态”方法,作为ArrayString的属性实现构造

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

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

Array.slice === Array.prototype.slice; // false

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

顺便说一句,如果您使用该方法,则不需要使用call方法,第一个参数是将用作this值的对象({ {1}})。

  

这里使用的原型是否显着?

是的,Array.slice(arguments)构造函数只是一个函数,标准Array方法,所有其他“数组方法”都在slice上定义。

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

如{{3}}所述,您可以使用Array实例获取对该方法的引用:

Array.prototype

理论上,这将创建一个新的Array对象,并在原型链中访问 [].slice === Array.prototype.slice; // true 方法,但我记得有些实现正在开始优化这种属性访问,避免创建一次性对象,因此,在某些方面,它在性能方面也会完全相同。

答案 1 :(得分:3)

应该注意:

var argslice = [].slice.call(arguments);

也可以,因为如果“slice”是对Array构造函数的原型上的函数的引用,那么构造数组上的“slice”就是(因此)非常相同的函数。

答案 2 :(得分:2)

Array.slice不存在(至少不在Chrome中)。

sliceArray对象原型的一部分,而不是Array本身的方法,因此要引用它,您需要完成原型。

答案 3 :(得分:2)

prototype包含“Array”对象上可用的所有函数。数组本身只引用构造函数。因此,您必须从原型中获取函数并将其应用于伪数组“arguments”。

答案 4 :(得分:2)

简短回答:是的,prototype很重要。

slice是Array对象的prototype对象的属性。如果存在Array.slice,则它将是Array构造函数的属性。

例如,当你写:

function MyConstructor() {
..
}

MyConstructor.someFunc = function() {
..
}

someFunc是MyConstructor函数对象的一个​​属性,因此不起作用:

var obj = new MyConstructor();

obj.someFunc(); // Throws error

但这会:

MyConstructor.someFunc();

如果要在所有实例上都有可用的属性,则必须将它们添加到构造函数的prototype对象中。例如:

MyConstructor.prototype.someFunc = function() {
..
};

这将允许您这样做:

var obj = new MyConstructor();

obj.someFunc();