Javascript - Получение «неопределенный» при попытке получить прототип массива - PullRequest
1 голос
/ 23 марта 2009

Я думаю, что это утечка мозгов в 5 утра, но у меня проблемы с пониманием этого.

obj = ['a','b'];
alert( obj.prototype ); //returns "undefined"

Почему obj.prototype не возвращает функцию Array(){ } в качестве прототипа? Он ссылается на Array как конструктор.

Ответы [ 5 ]

7 голосов
/ 23 марта 2009

Поскольку у экземпляра нет прототипа, класс * имеет.

Возможно, вы хотите obj.constructor.prototype или альтернативно obj.constructor==Array

* , чтобы быть более точным, конструктор имеет прототип, но, конечно, в JS functions = classes = constructors

1 голос
/ 23 марта 2009

Согласно спецификации ECMA, ссылка на прототип объекта не видна, но большинство современных браузеров (firefox, safari, chrome) позволяют видеть ее через свойство __proto__, поэтому попробуйте:

obj = ['a','b'];
alert( obj.__proto__ );

Объект также имеет свойство конструктора, установленное при построении, поэтому вы можете попробовать:

obj = ['a','b'];
alert( obj.constructor.prototype );

Однако obj.constructor можно изменить после создания объекта, как и obj.constructor.prototype, без изменения фактического указателя прототипа объекта obj.

1 голос
/ 23 марта 2009

В вашем примере obj является экземпляром Array, а не самого класса Array.

Другой способ понять это состоит в том, что, например, вы не можете наследовать от экземпляра объекта (или класса), вы можете наследовать только от самого объекта (или класса), который в В вашем примере это означает, что вы можете наследовать от объекта Array, но не от прямого экземпляра объекта Array, такого как obj.

1 голос
/ 23 марта 2009

Я не уверен, что вы можете получить доступ к объекту prototype из экземпляра объекта. Вам может помочь следующее поведение:

alert(Array); // displays "function Array() { [native code] }"
alert(Array.prototype); // displays ""
alert(['a','b'].constructor); // displays "function Array() { [native code] }"

obj.prototype не возвращает function Array() { ... }, так как это конструктор объекта.

0 голосов
/ 23 марта 2009

Не совсем моя чашка чая, но делает ли этот способ определения "obj" массивом? Пробовал

obj = new Array();
obj[0] = "a";
obj[1] = "b";

...