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

时间:2019-10-09 19:50:26

标签: javascript object properties getter accessor

我想知道HTML元素的textContent属性是否是一种吸气剂,它正在递归地搜索节点以找到文本节点。

我做了一个实验:

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的结果相同。

这使我提出了一个问题。有什么方法可以确定某个属性是否是访问者?

1 个答案:

答案 0 :(得分:3)

是的。 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))