Что происходит в консоли, когда я смотрю свойства геттера для объектов DOM?

При запуске следующего кода в консоли:

console.dir(document);

В Chrome я вижу среди прочего:

enter image description here

Кажется, это подразумевает, что свойство domain находится непосредственно в объекте document. Однако это не так.

console.log(document.hasOwnProperty('domain'));

Ответ 1

Можно ли создать объект с тем же поведением регистрации, что и console.diring объекта также немедленно вызовет любые методы получения в цепочке прототипов вместо отображения (...)?

С технической точки зрения да, несмотря на то, что он не будет точно оценивать получатели (я не уверен, что значения, которые вы видите, оцениваются, когда вы их задаете console.dir). Вам необходимо оценить недвижимость. Однако использование hasOwnProperty вернет true.

// look at results in Chrome browser console, not snippet console
class theProto {
  get foo() {
    return 'fooVal';
  }
  set foo(arg) {
    // do something
  }
}
class theClass extends theProto {
   foo = (() => theProto.prototype.foo)(); // or, really, just (() => this.foo)();
}
const instance = new theClass();
console.dir(instance);

Ответ 2

Есть несколько вещей, о которых нужно знать.

  1. Во-первых, операторы console. * (Кроме .error) являются асинхронными, вы передаете объект документа по ссылке, которая может фактически измениться между передачей его в console.FN и фактическим выводом в окно журнала.
  2. Во-вторых, это то, что браузер имеет доступ к большему, чем вы могли бы через JS API напрямую с точки зрения опроса.
  3. В-третьих, сам документ может иметь цепочку наследования, которая включает в себя такие вещи, как домен, который не является частью самого экземпляра документа.
  4. В-четвертых, не все свойства итеративны по своей структуре, но все равно могут отображаться в журнале (см. № 2 выше).

Ответ 3

Оператор document.hasOwnProperty() возвращает true, только если объект имеет указанное свойство в качестве своего собственного свойства (в отличие от его наследования). В этом случае свойство домена наследуется от объекта HTMLDocument. HTMLDocument является прототипом документа. Так что возвращается false.