9

它看起来像用 Object.create 创建的数组像数组一样行走,像数组一样嘎嘎,但仍然不是真正的数组。至少使用 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

4

2 回答 2

5

最简洁的答案是不。这篇文章详细解释了这一切。

于 2012-01-26T09:53:30.243 回答
3

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

你所说的“期望的 Object.prototype.toString 行为”是[[Class]]对象的内部,这是不可能用Object.create. 只能通过使用数组文字调用构造函数来创建“真正的数组”(具有Array类和特殊的数组行为索引属性) 。.lengthArray

于 2014-10-22T18:34:35.773 回答