Первый: DOMWindow
, как показано в консоли, является результатом интеллектуальных инструментов разработчика: в этом случае отображается имя конструкторов. Когда вы явно используете window.__proto__.toString()
, [object Object]
будет показано три раза.
Примечание о дизайне
Чтобы ответить на ваш вопрос о дизайне, я привожу спецификацию ES5 (выделение мое):
Все объекты имеют внутреннее свойство с именем [[Prototype]]
. Значение
это свойство имеет значение null или объект и используется для
реализация наследства. Может ли нативный объект иметь
Хост-объект как его [[Prototype]]
зависит от реализации. Каждый
[[Prototype]]
цепочка должна иметь конечную длину (то есть начиная с
любой объект, рекурсивно обращающийся к внутреннему свойству [[Prototype]]
должно в конечном итоге привести к значению null
).
Итак, это не странно, что вы видите null
в конце.
Подробнее
Некоторые (технические) примечания заранее:
Таблица:
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
- Глобальный объект .
Примеры: window
в браузере-JavaScript, global
в Node.js .
- Согласно разделу 15.1 1062 * свойства
[[Prototype]]
и [[Class]]
global
зависят от реализации. В Chrome реализация DOMWindow
выглядит так, как описано в this IDL .
- В Chrome этот конструктор буквально не имеет имени. В Firefox это класс
Global Scope Polluter
.
Это кажется фиктивным объектом, отсюда и отсутствие свойств.
- Предыдущий объект является истинным экземпляром
Object
.
Это объясняет зарегистрированные __defineGetter
и т. Д. Свойства в консоли.
- Свойство
[[Prototype]]
Object.prototype
равно null
, см. раздел 15.2.4 .
Дополнительные ссылки