Массивы Javascript, созданные с помощью Object.create - не настоящие Массивы? - PullRequest
8 голосов
/ 26 января 2012

Похоже, массивы, созданные с помощью 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?

Ответы [ 2 ]

5 голосов
/ 26 января 2012

Короткий ответ - нет. Эта статья объясняет все это в некоторых деталях.

3 голосов
/ 22 октября 2014

Нет, вы не можете. Object.create - это все о прототипах, но [] и Object.create(Array.prototype) наследуются от одного и того же объекта-прототипа.

То, что вы называете " требуемое поведение Object.prototype.toString ", является внутренним [[Class]] объекта, который невозможно настроить с помощью Object.create. Создание «истинных массивов» (с классом Array и специальным поведением массива - индексированные свойства, .length) возможно только с использованием литералов массива или , вызывающих 1017 * конструктор .

...