При запуске следующего кода в консоли:
console.dir(document);
В Chrome я вижу, среди прочего:
![enter image description here](https://i.stack.imgur.com/Hq2qy.png)
Кажется, это означает, что свойство domain
находится непосредственно на объекте document
.Однако это не так.
console.log(document.hasOwnProperty('domain'));
В Chrome 72, поднимаясь по цепочке прототипов, он, кажется, находится на Document.prototype
:
console.log(Document.prototype.hasOwnProperty('domain'));
console.log(Object.getOwnPropertyDescriptor(Document.prototype, 'domain'));
(в FF 56 и, возможно, в некоторых других браузерах он отображается вместо HTMLDocument.prototype
)
Как видно из фрагмента,свойство на самом деле состоит из геттера и сеттера.Но у меня сложилось впечатление, что геттеры отображаются в консоли как (...)
, как в это изображение , которое вы должны были нажать на (...)
, чтобы вызвать геттер.
Если я создаю подобный объект, прототип которого содержит свойство getter / setter, и я регистрирую объект, метод get не вызывается при его исследовании:
// look at results in Chrome's browser console, not snippet console
class theProto {
get foo() {
return 'fooVal';
}
set foo(arg) {
// do something
}
}
class theClass extends theProto {
}
const instance = new theClass();
console.dir(instance);
![enter image description here](https://i.stack.imgur.com/YwPEd.png)
Такое же поведение можно наблюдать для многих свойств document
.Например, все других свойств, которые вы видите на первом снимке экрана, также являются геттерами / сеттерами для одного из объектов-прототипов, и ни одно из них не включено в document
:
console.log(
['dir', 'doctype', 'documentElement', 'documentURI', 'embeds', 'fgColor', 'firstChild', 'firstElementChild']
.some(prop => document.hasOwnProperty(prop))
);
Это также можно увидеть в свойствах window
и элементах.Это происходит и в FF.
const input = document.createElement('input');
// console.dir(input);
// but the own property list is empty!
console.log(Object.getOwnPropertyNames(input));
<img src="https://i.stack.imgur.com/R5u3S.png">
Возможно ли создать объект с таким же поведением ведения журнала, как и эти, когда console.dir
объект также немедленно вызовет любые геттеры в цепочке прототиповвместо отображения (...)
?Как мне изменить мой theClass
фрагмент?Или же некоторые предопределенные объекты (например, объекты DOM) просто имеют исключение из обычного поведения ведения журнала?
Я знаю, как программно вызывать геттеры, мне просто любопытно, как выглядит несоответствие.