Object.getPrototypeOf не работает? - PullRequest
0 голосов
/ 24 марта 2012

Я читаю этот пост . Он определяет простой массив:

var myArray = [1, 2];
myArray.push(3);
myArray.reverse();
myArray.pop();
var length = myArray.length;

и затем пытается (и успешно) получить свой прототип через Object.getPrototypeOf. Однако, когда я проверил это в Firebug и консоли Chrome, я получил пустой массив. Почему?.

Однако, когда я делаю то же самое для объекта (в данном случае точечного объекта, определенного в том же посте), я фактически получаю его прототип.

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Инструменты разработчика Chrome отображают Array.prototype в виде массива, поскольку для этого поведения достаточно двух требований:

  • , имеющих свойство .length
  • , имеющее .splicefunction

Экземпляры массива имеют эти свойства, поэтому вы видите массивы как фактические массивы, что полезно.Проблема в том, что Array.prototype также является массивом в соответствии с инструментами разработчика Chrome из-за этих правил (, что также является , но это не очень полезная визуализация, потому что у него не должно быть элементов).

Если вы оцените Object.getPrototypeOf(myArray) === Array.prototype, вы получите true.Это просто инструменты разработчика Chrome, которые не отображают Array.prototype, как вы могли бы ожидать.

1 голос
/ 24 марта 2012

Это связано с тем, что прототипом класса Array является экземпляр / an Array, который имеет настраиваемое отображение на консолях Webkit. Так что это именно тот прототип, который вам нужен.

И он пуст, потому что вы храните значения всегда в экземпляре (myArray), а не в / в его прототипе.

Чтобы развернуть методы и поля, сделайте это:

for-in or Object.getOwnPropertyNames(Object.getPrototypeOf(myArray));
...