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您能帮我解决一下,让我知道到底是什么困扰您吗?“我的意思是,这也让我感到不安,但我很好奇,到底是什么让你在这里感到不安。”本杰明·鲁恩鲍姆说,“嗯,我只是碰巧又加了一句话。嗯。。可以在数组实例上调用它们(例如,间接调用)——可以在所有对象上调用所有对象。这是毫无意义的,因为他们不使用
这个
值。