关于prototype
的问题:
为什么有些Array方法有.prototype
而其他方法没有?
documentation个州“Array.prototype
代表Array
构造函数的原型。”
我试图将这个陈述与prototype
是一个引用父类型的属性的理解相协调,因为这就是继承的实现方式。
如果后者为真,那么Array
的父类型是谁拥有map()
和indexOf()
等方法?
我的主要问题是第一行的问题。
答案 0 :(得分:5)
原型上没有的方法就像其他语言中的“类”方法一样( kind-of ;相似性是肤浅的)。原型上的方法可以从任何数组实例的上下文中调用;直接在构造函数上的方法不是。
“length”属性是每个数组实例的属性;构造函数上也有一个“length”属性,但它的意思完全不同 - 它告诉你函数中有多少形式参数(Array函数)。
Array的“父类型”,在JavaScript中这样的事情是有意义的,是“对象”,但这与Array原型上的方法没有任何关系。
答案 1 :(得分:5)
我正在尝试协调这个语句,并理解prototype是一个引用父类型的属性,因为这就是继承的实现方式。
没有。与另一个对象(从中继承属性)的原型关系是通过不可见的链接完成的,有时表示为[[prototype]]
。
构造函数上的实际现有.prototype
属性是该对象构造的所有实例都将继承的对象。
因此,Array对象的原型(继承)链如下所示:
null
^
|
Object.prototype ---> {hasOwnProperty(), …} // all objects inherit these
^
|
Array.prototype ----> {map(), indexOf(), …} // all arrays inherit these
^
|
{length, 0, 1, 2, …} // an example array
// as if constructed by new Array(5) or [42, 7, 6]
为什么有些方法有.prototype而有些方法没有?
.prototype
上可用的函数将由所有实例继承,如果它们是它们的方法,您可以直接在它们上调用它们。
直接放在构造函数上的函数,如Array.isArray
或Array.of
,与实例无关,而且与“静态”无关。你主要用非数组作为参数调用它们。
答案 2 :(得分:4)
Array.prototype.*
方法可以在数组实例上调用,并且看起来是这些实例的“方法”,而Array.*
方法不能(至少不是直接),而是必须从Array
对象本身。
例如:
[].concat([]) // calls Array.prototype.concat
Array.concat([]) // undefined
Array.isArray([]) // calls Array.isArray
[].isArray([]) // undefined