Javascript – получение «неопределенного» при попытке получить прототип массива

StackOverflow https://stackoverflow.com/questions/673107

  •  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";

?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top