Класс объекта входит дважды в цепочку прототипов DOMWindow? - PullRequest
5 голосов
/ 03 апреля 2012

Почему у нас есть 2 класса Object и снова Object в цепочке прототипов окна?

window -> DOMWindow ---> Object ---> Object ---> null

Может кто-нибудь подсказать, пожалуйста, об этом дизайне?

Follwing - это вывод на хром.

enter image description here

1 Ответ

2 голосов
/ 03 апреля 2012

Первый: DOMWindow, как показано в консоли, является результатом интеллектуальных инструментов разработчика: в этом случае отображается имя конструкторов. Когда вы явно используете window.__proto__.toString(), [object Object] будет показано три раза.

Примечание о дизайне

Чтобы ответить на ваш вопрос о дизайне, я привожу спецификацию ES5 (выделение мое):

Все объекты имеют внутреннее свойство с именем [[Prototype]]. Значение это свойство имеет значение null или объект и используется для реализация наследства. Может ли нативный объект иметь Хост-объект как его [[Prototype]] зависит от реализации. Каждый [[Prototype]] цепочка должна иметь конечную длину (то есть начиная с любой объект, рекурсивно обращающийся к внутреннему свойству [[Prototype]] должно в конечном итоге привести к значению null).

Итак, это не странно, что вы видите null в конце.

Подробнее

Некоторые (технические) примечания заранее:

  • Object.getPrototypeOf( obj ) возвращает свойство [[Prototype]] объекта obj.
  • Свойство [[Class]] объекта представляет его внутренний класс. Его имя можно извлечь, используя Object.prototype.toString.call( obj ).

Таблица:

   toString() result:   [[Class]]   #  Additional notes
1. [object DOMWindow]    global     # The global object
2. [object Object]       Object     # [[Prototype]] of the Global object
3. [object Object]       Object     # [[Prototype]] of 2 (dummy?)
4. [object Object]       Object     # [[Prototype]] of 3 === Object.prototype
5. [object Null]         Null       # Object.prototype.__proto__ === null
  1. Глобальный объект .
    Примеры: window в браузере-JavaScript, global в Node.js .
  2. Согласно разделу 15.1 1062 * свойства [[Prototype]] и [[Class]] global зависят от реализации. В Chrome реализация DOMWindow выглядит так, как описано в this IDL .
  3. В Chrome этот конструктор буквально не имеет имени. В Firefox это класс Global Scope Polluter.
    Это кажется фиктивным объектом, отсюда и отсутствие свойств.
  4. Предыдущий объект является истинным экземпляром Object.
    Это объясняет зарегистрированные __defineGetter и т. Д. Свойства в консоли.
  5. Свойство [[Prototype]] Object.prototype равно null, см. раздел 15.2.4 .

Дополнительные ссылки

...