我正在阅读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)
?在这里使用原型显着吗?
答案 0 :(得分:7)
为什么要使用Array.prototype而不仅仅是Array.slice.call(arguments)?
Array.slice
方法是Array and String Generics的一部分,@Pointy是一组“静态”方法,作为Array
和String
的属性实现构造
这些方法非标准,它们仅在基于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中)。
slice
是Array
对象原型的一部分,而不是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();