【问题标题】:Why is length a property of `Array` not `Array.prototype` chain为什么长度是`Array`的属性而不是`Array.prototype`链
【发布时间】:2017-12-29 10:15:34
【问题描述】:

所以我在 V8 控制台上玩了很多,我做到了

Object.getOwnPropertyNames([])

我希望得到[],但是["length"]

这意味着length 不是原型链的一部分,而是所有Array 对象的成员属性。

这是一个错误,还是有任何设计或特定原因length 不是原型链的一部分?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

这不是错误。根据定义,Object.getOwnPropertyNames 将返回对象的所有可枚举和不可枚举的自身属性。对于数组,长度是一个自己的属性,但它的可枚举属性是假的。这就是它被包含在结果中的原因。

你可以用下面的sn-p测试一下,

console.log(Object.getOwnPropertyDescriptors([]));

上面的代码将返回所有自己属性的描述符。检查它,你就会知道它的可枚举属性。

【讨论】:

    【解决方案2】:

    原型属性在对象之间共享。因此,如果将长度放在原型上,则所有数组对象都将具有相同的长度,这是错误的。长度表示当前数组中的元素个数,应该是 self 的属性。

    【讨论】:

    • 那么原型链,本质上是单例的?
    • @Ayush Gupta 是的
    【解决方案3】:

    因为它不可枚举 (Object#propertyIsEnumerable)。

    延伸阅读:Enumerability and ownership of properties

    console.log([].propertyIsEnumerable('length'));

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 2011-06-10
      • 2012-12-12
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      相关资源
      最近更新 更多