如何检查对象的 属性 是 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))
我想知道 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))