为什么有些方法有.prototype而其他方法没有?

时间:2013-12-11 17:16:48

标签: javascript

关于prototype的问题: 为什么有些Array方法有.prototype而其他方法没有?

JavaScript Array method names screenshot

documentation个州“Array.prototype代表Array构造函数的原型。”

我试图将这个陈述与prototype是一个引用父类型的属性的理解相协调,因为这就是继承的实现方式。

如果后者为真,那么Array的父类型是谁拥有map()indexOf()等方法?

我的主要问题是第一行的问题。

3 个答案:

答案 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.isArrayArray.of,与实例无关,而且与“静态”无关。你主要用非数组作为参数调用它们。

答案 2 :(得分:4)

Array.prototype.*方法可以在数组实例上调用,并且看起来是这些实例的“方法”,而Array.*方法不能(至少不是直接),而是必须从Array对象本身。

例如:

[].concat([]) // calls Array.prototype.concat
Array.concat([]) // undefined

Array.isArray([]) // calls Array.isArray
[].isArray([]) // undefined