Javascript 使对象字符串键可枚举

Javascript make object string keys enumerable

我有一个 class 设置了字符串键,如下所示:

class MyClass {
    constructor() {
        this.id = 0
        this.data = []
    }

    "GET /data"(req, res) {
        res.json(this.data)
    }
}

目标是在这样的实例中动态循环函数:

for (let key in new MyClass()) {
    console.log(key)
}

然而,我尝试过的一切都只得到了键 iddata

我可以手动获取函数,运行 就好了:

let item = new MyClass()
item["GET /data"]()

但它没有出现在我尝试过的任何动态枚举中。

手动设置枚举也有效:

class MyClass {
    constructor() {
        this.id = 0
        this.data = []
        
        // Here!!!
        Object.defineProperty(this, "GET /data", {
            value: this["GET /data"],
            writable: false,
            enumerable: true,
            configurable: true
        })
    }

    "GET /data"(req, res) {
        res.json(this.data)
    }
}

console.log(Object.keys(new MyClass())) // ["id", "data", "GET /data"]

但这违背了动态执行的目的。有什么方法可以动态获取带有字符串键的函数名称,或者使每个 属性 可枚举?

有两种方法可以做到这一点

Object.keys(myObj)

for (let key in myObj) {
}
Object.getOwnPropertyNames(MyClass.prototype)

给你

["constructor", "GET /data"]