我有一个看起来像这样的对象:
const obj = {
x: 1,
y: 2,
foo() {
return "foo";
},
get bar() {
return "bar";
}
}
为了简单起见,这个对象只有一个 getter 方法,但是,其他对象可以有更多的 getter。
是否有一种简单的方法来获取对象的属性,从而排除所有函数以及所有 getter 方法?
我想要的结果是:
const properties = ["x", "y"];
我试着研究使用 Object.keys()
,但是这给出了所有属性,包括所有方法。我也试过调查 Object.getOwnPropertyNames()
,但是,这仍然包括结果中的所有函数名称。
请注意:我知道我可以通过在某处维护我自己的一组 getter 并检查是否属性包含在该集合中。但是,这对我来说似乎不是一个很好的解决方案,因为集合和对象的属性之间存在依赖关系。我还知道我可以将方法的 enumerable
属性设置为 false
。但是,这需要我扫描对象中的所有方法并手动执行此操作。有没有更简单的方法可以自动执行此操作以达到预期的结果?
最佳答案
使用Object.getOwnPropertyDescriptors
获取具有相同键的对象,其值是描述符。使用 Object.entries
将对象转换为数组,使用 .filter
过滤具有 .value
的描述符(仅数据描述符;访问描述符,就像那些有 setter/getter 的人一样,没有 .value
s) 并确保该值也不是函数。然后 .map
到他们的键:
const obj = {
x: 1,
y: 2,
foo() {
return "foo";
},
get bar() {
return "bar";
}
};
const output = Object.entries(Object.getOwnPropertyDescriptors(obj))
.filter(([, desc]) => desc.hasOwnProperty('value') && typeof desc.value !== 'function')
.map(([key]) => key);
console.log(output);
关于javascript - 如何轻松地从对象中获取非 getter 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58387089/