Object.constructor===Object.constructor.constructor // почему?

указано здесь https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function свойство конструктора экземпляра функционального объекта «указывает функцию, которая создает прототип объекта». Это сбивает с толку, так что Object.constructor — это «функция, создающая прототип объекта»? Какой именно объект является «объектом»?

Я пытаюсь понять, почему само свойство конструктора Object.constructor?

как таковой: Object.constructor===Object.constructor.constructor // почему?

Редактировать: я нахожу T.J. Ответ Краудера хорош, но формулировка его слов довольно расплывчата (что затрудняет понимание при первом прочтении, по крайней мере, для меня). Вот перефразированный ответ:

1) Объект является экземпляром Функции.

2) Object не имеет свойства с именем constructor, поэтому, когда мы вызываем Object.constructor, он фактически дает нам Object.[[ прототип]].constructor (он же Object.__proto__.constructor).

3) Object.constructor (также известный как Object.__proto__.constructor) является экземпляром Function.

4) Поскольку и Object, и Object.constructor (он же Object.__proto__.constructor) являются экземплярами Function, поэтому они оба имеют свойство __proto__, которое ссылается на один и тот же объект. Другими словами, Object.__proto__ === Object.constructor.__proto__ (он же Object.__ прототип__.constructor._прото_)

5) Строка Object.constructor===Object.constructor.constructor фактически равна строке Object.__proto__.constructor===Object. конструктор.__прото__.конструктор

6) объединение шагов 4 и 5 дает нам Object.constructor===Object.constructor.constructor

7) перейти к шагу 4)


person Pacerier    schedule 11.05.2011    source источник
comment
joost.zeekat.nl/constructors-considered-mildly-confusing.html   -  person Ates Goral    schedule 12.05.2011
comment
Хорошая диаграмма расположения объектов JS находится здесь. >   -  person Jyoti Prasad Pal    schedule 20.08.2017


Ответы (2)


Поскольку Object — это Function, а конструктор Function — это Function, его конструктор — это он сам.

«Объект» — это фундаментальный строительный блок объектно-ориентированного программирования. Object в JavaScript — это функция-конструктор (например, Date или RegExp). Его работа заключается в инициализации новых экземпляров объектов, созданных интерпретатором с помощью ключевого слова new.

Это может быть не по теме или нет, поскольку вы спрашиваете о конструкторах:

Любая функция в JavaScript может быть функцией-конструктором; это просто вопрос того, как вы его используете. Рассмотреть возможность:

function Foo() {
}

Если я назову это так:

var f = Foo();

... это просто скучная старая функция, и f получает undefined (поскольку Foo ничего не возвращает). Но если я назову это так:

var f = new Foo();

...Я использую его как функцию конструктора, и происходит нечто более интересное:

  1. Интерпретатор создает новый пустой объект.
  2. Интерпретатор устанавливает базовый прототип нового объекта равным Foo.prototype.
  3. Интерпретатор вызывает Foo таким образом, что this указывает на новый объект.
  4. Когда Foo завершается, если Foo не возвращает значение (или не возвращает объект), результатом выражения new является объект, созданный на шаге 1. (Если Foo возвращает объект, вместо него используется этот объект; продвинутая вещь, которую большинству людей не нужно делать.)
person T.J. Crowder    schedule 11.05.2011

Макет объекта JavaScript

введите здесь описание изображения

person nandin    schedule 11.05.2011
comment
Хорошая диаграмма. Обратите внимание, что __proto__ не является стандартным и поддерживается не всеми реализациями. Концепция всегда есть, но не символ. (Спецификация называет его [[Prototype]] и не делает его доступным программно, кроме как через совершенно новую функцию Object.getPrototypeOf в ECMAScript5.) - person T.J. Crowder; 11.05.2011