【发布时间】: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