Javascript 为什么有些方法有.prototype,而有些方法没有';T
关于原型的问题: 为什么有些数组方法有Javascript 为什么有些方法有.prototype,而有些方法没有';T,javascript,Javascript,关于原型的问题: 为什么有些数组方法有.prototype,而有些没有 状态“Array.prototype表示Array构造函数的原型” 我试图使这句话与以下理解相一致:prototype是一个引用父类型的属性,因为继承就是这样实现的 如果后者为真,那么Array的父类型是什么?谁“拥有”了map()和indexOf()等方法 我的主要问题是第一行的问题。原型中没有的方法类似于其他一些语言中的“类”方法(某种程度上,相似性是肤浅的)。原型上的方法可以从任何数组实例的上下文调用;直接在构造函数
.prototype
,而有些没有
状态“Array.prototype
表示Array
构造函数的原型”
我试图使这句话与以下理解相一致:prototype
是一个引用父类型的属性,因为继承就是这样实现的
如果后者为真,那么Array
的父类型是什么?谁“拥有”了map()
和indexOf()等方法
我的主要问题是第一行的问题。原型中没有的方法类似于其他一些语言中的“类”方法(某种程度上,相似性是肤浅的)。原型上的方法可以从任何数组实例的上下文调用;直接在构造函数上的方法不可用
“length”属性是每个数组实例的属性;构造函数也有一个“length”属性,但它的含义完全不同——它告诉您函数(数组函数)中有多少形式参数
数组的“父类型”在JavaScript中有意义,它是“对象”,但与数组原型上的方法无关。数组.prototype.
方法可以在数组实例上调用,并且似乎是这些实例的“方法”,而Array.*
方法不能(至少不能直接),必须从Array
对象本身调用
例如:
[].concat([]) // calls Array.prototype.concat
Array.concat([]) // undefined
Array.isArray([]) // calls Array.isArray
[].isArray([]) // undefined
我试图使这一陈述与以下理解相一致:原型是一个引用父类型的属性,因为继承就是这样实现的
不可以。与另一个对象(从中继承属性)的原型关系是通过一个不可见的链接完成的,有时表示为[[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
上可用的函数将被所有实例继承,如果它们是它们的一种方法,您可以直接在它们上调用它们
直接放在构造函数函数上的函数,如
Array.isArray
或Array.of
,与实例无关,可以说是“静态的”。大多数情况下,您使用非数组作为参数来调用它们。所有函数都有.prototype
属性。@Bergi您确定吗;)?(提示.bind
和主机环境定义的函数)@BenjaminGruenbaum:Oops,你说得对。只有本机构造函数和任何用户创建的函数对象才具有.prototype
属性。谢谢你的提醒!我想对这句话的正确性进行评价,但“类”方法的类比让我感到困扰。请考虑一下正在发生的事情。主要问题是原型中的方法适用于每个数组,并且通常具有动态“this”。@BenjaminGruenbaum您能帮我解决一下,让我知道到底是什么困扰您吗?“我的意思是,这也让我感到不安,但我很好奇,到底是什么让你在这里感到不安。”本杰明·鲁恩鲍姆说,“嗯,我只是碰巧又加了一句话。嗯。。可以在数组实例上调用它们(例如,间接调用)——可以在所有对象上调用所有对象。这是毫无意义的,因为他们不使用这个
值。