В книге Секреты JavaScript Ninja, 2013, страница 125, говорится:
Каждый объект в JavaScript имеет неявное свойство с именем
constructor
который ссылается на конструктор, который использовался для создания объекта. И поскольку прототип является свойством конструктор, каждый объект имеет способ найти свой прототип.
На самом деле это может быть одна из самых ошибочных вещей, которые я слышал о JavaScript, и она исходила от предположительно эксперта JavaScript. Не правда ли, что
-
любой объект JavaScript "имеет способ найти свой прототип" с использованием внутреннего свойства
[[prototype]]
(как в спецификации ECMA-262, стр. 32). Он доступен в Chrome и Firefox с помощью__proto__
, а в более поздних версиях IE, используяObject.getPrototypeOf
-
любой объект получает свойство
constructor
, получая его в объекте прототипа, на который указывает__proto__
. Свойствоconstructor
иногда даже не устанавливается корректно, так как некоторые библиотеки JavaScript или фреймворки вообще не используют его.constructor
- свойство объекта-прототипа, а не свойство самого объекта:
(как показано в инструменте разработчика Chrome):
> function Foo() {}
undefined
> var foo = new Foo()
undefined
> foo.hasOwnProperty("constructor")
false
> foo.__proto__.hasOwnProperty("constructor")
true
> foo.__proto__.constructor === Foo
true
Является ли приведенное выше (1) и (2) истинным? Что такое "неявное свойство с именем constructor
" в JavaScript, как в цитируемом тексте? Старается ли это что-то вроде [[prototype]]
, являющегося внутренним свойством? Но что более важно, я хотел бы знать, верны ли (1) и (2) выше, а не то, что говорит цитируемый текст.