如何列出给定对象的所有获取属性?
How can I list all the get properties from a give object?
给出 class:
export class Foo
{
#x: number;
#y : number;
constructor()
{
this.#x = 20;
this.#y = 10;
}
public get a(): string { return "baa"; }
public get n(): number { return 20; }
}
如何获取 getter 属性,即 ["a", "n"]
?我还没有要显示的代码,我已经查看了 reflect
and reflect-metadata
,但找不到任何内容来列出这些代码。我正在使用打字稿,但也欢迎 javascript 解决方案。
您可以遍历原型(或对象及其每个原型)的 属性 描述符,并查看描述符是否具有 get
函数。
const logGetters = obj => {
if (!obj) return;
for (const [key, desc] of Object.entries(Object.getOwnPropertyDescriptors(obj))) {
if (desc.get && key !== '__proto__') console.log(key); // exclude Object.prototype getter
}
logGetters(Object.getPrototypeOf(obj));
};
class Foo {
#x;
#y;
constructor() {
this.#x = 20;
this.#y = 10;
}
get a() {
return "baa";
}
get n() {
return 20;
}
}
const f = new Foo();
logGetters(f);
对于 Typescript,只需使用 const logGetters = (obj: object) => {
进行注释。
您可以 filter
超过 Object.getOwnPropertyDescriptors
。
class Foo
{
#x;
#y;
constructor()
{
this.#x = 20;
this.#y = 10;
}
get a() { return "baa"; }
get n() { return 20; }
}
const res = Object.entries(Object.getOwnPropertyDescriptors(Foo.prototype))
.filter(([k, d])=>typeof d.get === 'function').map(([k])=>k);
console.log(res);
给出 class:
export class Foo
{
#x: number;
#y : number;
constructor()
{
this.#x = 20;
this.#y = 10;
}
public get a(): string { return "baa"; }
public get n(): number { return 20; }
}
如何获取 getter 属性,即 ["a", "n"]
?我还没有要显示的代码,我已经查看了 reflect
and reflect-metadata
,但找不到任何内容来列出这些代码。我正在使用打字稿,但也欢迎 javascript 解决方案。
您可以遍历原型(或对象及其每个原型)的 属性 描述符,并查看描述符是否具有 get
函数。
const logGetters = obj => {
if (!obj) return;
for (const [key, desc] of Object.entries(Object.getOwnPropertyDescriptors(obj))) {
if (desc.get && key !== '__proto__') console.log(key); // exclude Object.prototype getter
}
logGetters(Object.getPrototypeOf(obj));
};
class Foo {
#x;
#y;
constructor() {
this.#x = 20;
this.#y = 10;
}
get a() {
return "baa";
}
get n() {
return 20;
}
}
const f = new Foo();
logGetters(f);
对于 Typescript,只需使用 const logGetters = (obj: object) => {
进行注释。
您可以 filter
超过 Object.getOwnPropertyDescriptors
。
class Foo
{
#x;
#y;
constructor()
{
this.#x = 20;
this.#y = 10;
}
get a() { return "baa"; }
get n() { return 20; }
}
const res = Object.entries(Object.getOwnPropertyDescriptors(Foo.prototype))
.filter(([k, d])=>typeof d.get === 'function').map(([k])=>k);
console.log(res);