【问题标题】:Where does the Array.prototype functions come from? [duplicate]Array.prototype 函数从何而来? [复制]
【发布时间】:2017-02-07 03:39:12
【问题描述】:

既然Array.prototype本身返回的是一个空数组,那么所有的函数都是从哪里来的呢?

为什么我可以调用 Array.prototype.sort 之类的函数,即使 Array.prototype 不是对象?

Array.prototype.__proto__ 是一个对象。

我对@9​​87654324@的情况也有同样的疑问。

【问题讨论】:

  • 为什么你认为Array.prototype 不是一个对象?数组(和函数)都是 JS 中的对象。

标签: javascript


【解决方案1】:

Array.prototype 是一个对象,您用于数组的大多数函数都来自它。所以这是原型

打开 chrome 开发栏,如下图所示检查。

【讨论】:

  • +1 表示console.debug(不幸的是不是标准的)。补充:Array.prototype.sort 不显示在console.log 中,因为它不是enumerable property。请与Array.prototype.propertyIsEnumerable("sort") 联系。 console.log 实现使用 Object.keys,并且,正如文档中所指出的,Object.keys() 方法返回给定对象自己的可枚举属性的数组
  • 感谢您的评论,xdazz。是的,我检查了 chrome 控制台,我有一个问题。当您调用 Array.prototype 时,它会显示 Array[0] 或 []。 Array.isArray(Array.prototype) 返回真。数组是内置对象之一,所以它是对象。
【解决方案2】:

即使Array.prototype 也不是对象?

你是怎么想到这个主意的?它是一个对象:

typeof Array.prototype // "object"

因此,它可以像其他所有对象一样具有属性。确实如此:

Array.prototype.hasOwnProperty("sort") // true
Array.prototype.sort // function(compare) { … }

这对于所有其他数组都是一样的,您可以像在每个 javascript 对象上一样在它们上创建自定义属性:

var foo = [];
foo.bar = "baz";
typeof foo.bar // "string"
Array.isArray(foo) // true

【讨论】:

  • 感谢您的评论。是的 typeof Array.prototype 返回“对象”,但 Array.isArray(Array.prototype) 也返回 true,这意味着它是数组原生对象,不是吗?如何从数组中检索函数?
  • 每个数组只是一个具有特殊行为 length 属性的对象(可能还有一些引擎优化),但在其他所有方面都是一个标准的 js 对象。
  • 我明白了。为什么Array.prototype 不包含普通键/值对象而不是数组或函数。使用数组作为键/值哈希表听起来不是一个好习惯..
  • 这是a simple but unsatisfying answer 的不同问题:-)
  • 啊,谢谢分享。我很困惑,因为我没想到 javascript 将数组用于类似哈希表的目的。谢谢你所有的 cmets。
猜你喜欢
  • 2011-05-14
  • 2021-04-29
  • 2020-12-23
  • 1970-01-01
  • 2023-03-27
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多