2013-12-11 248 views
7

关于prototype的问题: 为什么某些数组方法有.prototype而其他数不?为什么某些方法有.prototype和其他方法没有?

JavaScript Array method names screenshot

documentation状态 “Array.prototype代表的原型Array构造”。

我试图调和这个声明,并理解prototype是一个涉及父类型的属性,因为这是如何实现继承。

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

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

+0

所有函数都具有'.prototype'属性。 – Bergi

+1

@Bergi你是否确信;)? (提示'.bind'和主机环境定义的函数) –

+2

@BenjaminGruenbaum:哎呀,你说得对。只有本机*构造函数*和任何用户创建的函数对象才具有'.prototype'属性。感谢您的提醒! – Bergi

回答

5

我试图调和的理解是原型是指父类型的属性,因为这是如何继承实现了这一说法。

否。与另一个对象(从中继承属性)的原型关系通过不可见链接完成,有时表示为[[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.isArrayArray.of)上的函数不是与实例相关的,也可以是“静态”的。你主要用非数组作为参数来调用它们。

5

不在原型上的方法类似于某些其他语言中的“类”方法(类型;相似性很肤浅)。原型上的方法可以从任何数组实例的上下文中调用;直接在构造函数上的方法不是。

“length”属性是每个数组实例的属性;在构造函数中也有一个“length”属性,但它的含义完全不同,它告诉你函数中有多少形式参数(数组函数)。

Array的“父类型”,在JavaScript中有这种意义的地方是“Object”,但这与Array原型上的方法没有任何关系。

+0

我想赞成这是正确的,但'类'方法比喻困扰着我。请考虑扩大发生的事情。主要问题在于原型上的方法可用于每个数组,并且通常具有动态“this”。 –

+0

@BenjaminGruenbaum你能帮我一下,让我知道究竟是什么让你感到困扰?我的意思是,它也困扰我,但我很好奇你在这里的确切关切。 – Pointy

+0

@BenjaminGruenbaum啊,我刚刚添加了另一句话,巧合。 – Pointy

4

Array.prototype.*方法可以被称为上阵列的情况下,而且似乎是这些实例的“方法”,而Array.*方法不能(至少不直接地),而是必须从Array对象本身调用。

例如:

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

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

好吧..他们可以在数组实例上调用(例如间接调用) - 每件事都可以调用。这只是没有意义,因为他们不使用'this'值。 –

+0

@BenjaminGruenbaum你是对的,更新。 –

相关问题