如何检查对象的 属性 是 getter 还是 setter?

How to check if a property of an object is a getter or a setter?

我想知道 HTML 元素的 textContent 属性 是否是 getter 递归搜索节点以查找文本节点。

我做了一个实验:

Object.defineProperty(HTMLElement.prototype, 'textContentMyOwnImplementation', {
 get() {
  const result = [];
  function search(node) {
   if(node.nodeName == '#text')
    result.push(node.data);
   else
    for(let i = 0; i < node.childNodes.length; i++) {
     search(node.childNodes[i]);
    }
  }
  search(this);
  return result.join(' ');
 }
})

结果与 textContent 的相同。

这让我想到了一个问题。有什么方法可以确定 属性 是否是访问器?

是的。 Object.getOwnPropertyDescriptor 方法与 defineProperty 相反:

const obj = {
  property: 'value',
  get accessor(){ return 'value' },
  set accessor(value){}
}

console.log(Object.getOwnPropertyDescriptor(object, 'property'))
/* 
{
  enumerable: true,
  writable: true,
  configurable: true,
  value: "value"
} 
*/

console.log(Object.getOwnPropertyDescriptor(object, 'accessor'))
/* 
{
  enumerable: true,
  writable: true,
  configurable: true,
  get: function(...){...},
  set: function(...){...}
} 
*/

使用它,您可以实现一个函数,为您确定:

const isAccessor = (object, property) => !('value' in Object.getOwnPropertyDescriptor(object, property))