使用Object.create创建的Javascript数组-不是真正的数组?

使用Object.create创建的Javascript数组-不是真正的数组?,javascript,v8,object-create,Javascript,V8,Object Create,它看起来像是用Object.create创建的数组,像walk-like数组和quack-like数组,但仍然不是真正的数组。至少使用v8/node.js > a = [] [] > b = Object.create(Array.prototype) {} > a.constructor [Function: Array] > b.constructor [Function: Array] > a.__proto__ [] > b.__proto__ []

它看起来像是用Object.create创建的数组,像walk-like数组和quack-like数组,但仍然不是真正的数组。至少使用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
将属性附加到新创建的数组中?

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

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


您所谓的“desired Object.prototype.toString Behavior”是对象的内部
[[Class]]]
,无法使用
对象进行设置。创建
。创建“真正的数组”(使用
数组
类和索引属性,
.length
)只能通过使用or来实现。

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