【问题标题】:Javascript Arrays created with Object.create - not real Arrays?使用 Object.create 创建的 Javascript 数组 - 不是真正的数组?
【发布时间】:2012-02-19 10:11:08
【问题描述】:

看起来像用 Object.create 创建的 Arrays walk like Arrays 和 quack like Arrays,但仍然不是真正的数组。至少使用 v8 / node.js。

> a = []
[]
> b = Object.create(Array.prototype)
{}
> a.constructor
[Function: Array]
> b.constructor
[Function: Array]
> a.__proto__
[]
> b.__proto__
[]
> a instanceof Array
true
> b instanceof Array
true
> Object.prototype.toString.call(a)
'[object Array]'
> Object.prototype.toString.call(b)
'[object Object]'

一些 Javascript 大师能否解释一下为什么会这样,以及如何使我新创建的数组与真实数组无法区分?

我的目标是克隆数据结构,包括可能附加了自定义属性的数组。当然,我可以使用Object.defineProperty 手动将属性附加到新创建的数组,但是有没有办法使用Object.create 来做到这一点?

【问题讨论】:

  • 它们对于您的目标来说是难以区分的。如何使完全无法区分——使用b = [];
  • @kirilloid - 这在某些情况下可能是一种有效的方法,但在工厂函数内部基于prototypeParam进行管道的情况下,您的建议不是一个选项。例如。在创建幺半群时,从: var monad = Object.create(prototypeParam);这里如果prototypeParam可以是Array.prototype就方便了

标签: javascript v8 object-create


【解决方案1】:

简短的回答是否定的。 This article 详细解释了这一切。

【讨论】:

【解决方案2】:

不,你不能。 Object.create 是关于原型的,但 []Object.create(Array.prototype) 都继承自同一个原型对象。

你所说的“期望的 Object.prototype.toString 行为”是对象的内部[[Class]],这是不可能用Object.create 设置的。只有使用array literalscalling the Array constructor 才能创建“真正的数组”(带有Array 类和special array behaviour - 索引属性.length)。

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多