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

标签 javascript object properties getter 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(' ');
	}
})

结果与 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))

关于javascript - 如何检查对象的属性是 getter 还是 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58311323/

相关文章:

java - 我很难理解 Java 对象和类

java - 如何在 eclipse rcp 中管理 i18n 属性文件?

ios - objective-c KVO : object vs changeDictionary

通过套接字发送对象时 Java 客户端应用程序卡住

javascript - nightwatch.js 在测试套件结束时暂停

javascript - 媒体查询不适用于 React App 中的样式化组件

javascript - 如何在 AngularJS 上创建模块/插件

java - OOP 解析并将对象添加到列表中

java - 应用程序属性作为静态变量或带有单例的实例变量

javascript - 在我的自定义指令中动态添加 bootstrap.ui 工具提示