关于prototype
的问题: 为什么某些数组方法有.prototype
而其他数不?为什么某些方法有.prototype和其他方法没有?
的documentation状态 “Array.prototype
代表的原型Array
构造”。
我试图调和这个声明,并理解prototype
是一个涉及父类型的属性,因为这是如何实现继承。
如果后者为真,那么Array
谁拥有map()
和indexOf()
等方法的父类型是什么?
我的主要问题是在第一行。
关于prototype
的问题: 为什么某些数组方法有.prototype
而其他数不?为什么某些方法有.prototype和其他方法没有?
的documentation状态 “Array.prototype
代表的原型Array
构造”。
我试图调和这个声明,并理解prototype
是一个涉及父类型的属性,因为这是如何实现继承。
如果后者为真,那么Array
谁拥有map()
和indexOf()
等方法的父类型是什么?
我的主要问题是在第一行。
我试图调和的理解是原型是指父类型的属性,因为这是如何继承实现了这一说法。
否。与另一个对象(从中继承属性)的原型关系通过不可见链接完成,有时表示为[[prototype]]
。
构造函数实际上存在的.prototype
属性是该函数构造的所有实例将继承的对象。
所以数组对象的原型(继承)链是这样的:
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
)上的函数不是与实例相关的,也可以是“静态”的。你主要用非数组作为参数来调用它们。
不在原型上的方法类似于某些其他语言中的“类”方法(类型;相似性很肤浅)。原型上的方法可以从任何数组实例的上下文中调用;直接在构造函数上的方法不是。
“length”属性是每个数组实例的属性;在构造函数中也有一个“length”属性,但它的含义完全不同,它告诉你函数中有多少形式参数(数组函数)。
Array的“父类型”,在JavaScript中有这种意义的地方是“Object”,但这与Array原型上的方法没有任何关系。
的Array.prototype.*
方法可以被称为上阵列的情况下,而且似乎是这些实例的“方法”,而Array.*
方法不能(至少不直接地),而是必须从Array
对象本身调用。
例如:
[].concat([]) // calls Array.prototype.concat
Array.concat([]) // undefined
Array.isArray([]) // calls Array.isArray
[].isArray([]) // undefined
好吧..他们可以在数组实例上调用(例如间接调用) - 每件事都可以调用。这只是没有意义,因为他们不使用'this'值。 –
@BenjaminGruenbaum你是对的,更新。 –
所有函数都具有'.prototype'属性。 – Bergi
@Bergi你是否确信;)? (提示'.bind'和主机环境定义的函数) –
@BenjaminGruenbaum:哎呀,你说得对。只有本机*构造函数*和任何用户创建的函数对象才具有'.prototype'属性。感谢您的提醒! – Bergi