为什么Object.getOwnPropertyDescriptors在HTMLElements上不起作用?

时间:2019-09-19 04:51:29

标签: javascript

如果横穿原型链,您会在底部(顶部?)看到Object.prototype,因此我认为它们的行为类似于普通对象。但是,Object.getOwnPropertyDescriptors并不能为您提供一个具有通过console.dir在控制台中查看该对象时将与该对象关联的所有属性的对象。怎么会这样?

for (let property of Object.keys(Object.getOwnPropertyDescriptors(document))) {
  console.log(property)
}

1 个答案:

答案 0 :(得分:2)

好问题。这是因为HTMLElement上的许多属性实际上是gettersetter原型函数。

DOM幕后发生了很多魔术,将几乎英语的document.body.style = 'background: pink;'变成了渲染的图形更新。使用getter和setter可以辅助反应模式,并消除了数千个HTMLElement上冗余属性构造的内存浪费。

示例:

// Class with prototype getter
class Thing {
  constructor() {
    this.year = new Date().getFullYear()
  }
  get time() {
    return Date.now();
  }
}
console.dir(new Thing());
// > Prints a JSON representation including `Thing#time` and `Thing#year`

console.log(Object.getOwnPropertyDescriptors(new Thing()));
/* 
 > Prints an object with *only* the `#year` descriptor 
   because `#time` is a prototype function, not a property
*/