【问题标题】:Why Array.prototype is an Array?为什么 Array.prototype 是一个数组?
【发布时间】:2014-05-14 10:41:21
【问题描述】:

我认为每个原型都应该是一个对象。

为什么?

Array.isArray( Array.prototype ) // 真

developer.mozilla.org 什么也没解释

【问题讨论】:

  • 数组是对象
  • @Quentin 什么?如果你会说“对象是数组”,它确实有意义,否则它没有
  • 我会说数组是一个数组。它的原型是一个数组,问题出在哪里?
  • @VladimirStarkov — 所有数组都是对象。并非所有对象都是数组。
  • @nicolallias 我不明白为什么 array.prototype 是数组而不是对象

标签: javascript prototype


【解决方案1】:

您认为每个原型都是Object 的假设是不正确的。

console.log(String.prototype)
console.log(Number.prototype)
console.log(Boolean.prototype)
console.log(Array.prototype)
console.log(Object.prototype)

输出:

String {}
Number {}
Boolean {}
[]
Object {}

来自ECMAScript Language Specification - 15.4.4 Properties of the Array Prototype Object(强调我的)

Array原型对象的[[Prototype]]内部属性的值是标准的内置Object原型对象(15.2.4)。

Array 原型对象本身就是一个数组;它的[[Class]]是“Array”,它有一个length属性(初始值为+0)和15.4.5.1中描述的特殊的[[DefineOwnProperty]]内部方法。

【讨论】:

  • 这是事实,但为什么?
  • @VladimirStarkov 因为这是规范所规定的。给你一个问题,为什么不呢?为什么你期望它是Object
  • 你能给我这个规范的链接吗?
  • @Stijn 因为如果它不是一个数组而只是一个对象就不会那么混乱,所以它必须有一个原因。那些家伙只是因为“为什么不呢?”而四处设计东西。
  • 虽然它并不特定于数组,但函数也是如此。在规范中,原因据说是:函数原型对象被指定为函数对象,以确保与在 ECMAScript 2015 规范之前创建的 ECMAScript 代码兼容。(这也适用于数组)这就是原因。但是,这导致了另一个原因,“为什么在 ECMAScript 2015 规范之前创建的 ECMAScript 代码将 Function.prototype 作为空函数?”。真是令人失望,事情应该比这更清楚。
【解决方案2】:

尝试在您的 javascript 控制台中输入以下内容: typeof Array.prototype;

Array.prototype 实际上是一个数组。此页面上有详细说明。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype

这可能与[]Array 的简写这一事实有关。

所以Array.prototype 指向[]Array.prototype.constructor 指向function Array() { [native code] }

[].constructor 也指向function Array() { [native code] }

所以猜测一下,这样做是为了让您可以互换使用Array[]

我不确定这是不是这个原因,但这是我最好的猜测。

【讨论】:

  • 你的回答说明不了什么
  • @VladimirStarkov 我已经解决了这个问题。它现在解释了一些东西。我应该从一开始就这样做。感谢您给我打电话并让我给出一个实际的答案。
  • 我很奇怪“这页上有详细说明”等于“鲜为人知的事实:”
  • 嗯..页面上有详细说明。没有理由感到奇怪。
  • 是的,但没有解释为什么会这样
猜你喜欢
  • 2012-08-26
  • 2011-06-10
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2020-09-29
  • 2015-01-24
相关资源
最近更新 更多