Javascript – получение «неопределенного» при попытке получить прототип массива
-
21-08-2019 - |
Вопрос
Я думаю, это утечка мозгов в 5 утра, но мне трудно это понять.
obj = ['a','b'];
alert( obj.prototype ); //returns "undefined"
Почему нет obj.prototype
возвращающая функция Array(){ }
в качестве прототипа?Это ссылка Array
как конструктор.
Решение
Поскольку у экземпляра нет прототипа, он есть у класса*.
Возможно, вы хотите obj.constructor.prototype
или альтернативно obj.constructor==Array
* если быть более точным, то конструктор есть прототип, но конечно в JS функции=классы=конструкторы
Другие советы
Я не уверен, что вы можете получить доступ к 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() { ... }
поскольку это конструктор объекта.
В вашем примере obj
является примером Array
, а не класс Array
сам.
Другой способ понять это: например, вы не можете наследовать от пример объекта (или класса), вы можете наследовать только от самого объекта (или класса), что в вашем примере означает, что вы можете наследовать от Array
объект, но не из прямого экземпляра объекта Array, такого как obj
.
Согласно спецификации ECMA, ссылка на прототип объекта не видна, но большинство современных браузеров (Firefox, Safari, Chrome) позволяют увидеть ее через __proto__
собственность, поэтому попробуйте:
obj = ['a','b'];
alert( obj.__proto__ );
Объект также имеет свойство «конструктор», установленное при создании, поэтому вы можете попробовать:
obj = ['a','b'];
alert( obj.constructor.prototype );
Однако, obj.constructor
могут быть изменены после создания объекта, как и obj.constructor.prototype
, без изменения фактического указателя прототипа obj.
Не совсем моя чашка чая, но делает ли этот способ определения "obj" массивом?Пытался
obj = new Array();
obj[0] = "a";
obj[1] = "b";
?