Как проверить, является ли свойство объекта геттером или сеттером? - PullRequest
1 голос
/ 09 октября 2019

Мне было интересно, является ли свойство textContent элемента HTML геттером, который рекурсивно просматривает узлы, чтобы найти текстовые узлы.

Я провел эксперимент:

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 Ответ

3 голосов
/ 09 октября 2019

Да. 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))
...