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

Sle*_*v7n 3 javascript getter properties object accessor

我想知道 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(' ');
	}
})
Run Code Online (Sandbox Code Playgroud)

结果与textContent 的结果相同。

这让我想到一个问题。有没有办法确定一个属性是否是访问器?

FZs*_*FZs 8

是的。该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(...){...}
} 
*/
Run Code Online (Sandbox Code Playgroud)

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

const isAccessor = (object, property) => !('value' in Object.getOwnPropertyDescriptor(object, property))
Run Code Online (Sandbox Code Playgroud)

  • 我只想补充说,“textContent”位于“Node.prototype”上,因此您需要执行以下命令:“Object.getOwnPropertyDescriptor(Node.prototype, 'textContent')” (2认同)