'Javascript make object string keys enumerable
I have a class set up with string keys, like this:
class MyClass {
constructor() {
this.id = 0
this.data = []
}
"GET /data"(req, res) {
res.json(this.data)
}
}
The goal is to dynamically loop over the functions in an instance like this:
for (let key in new MyClass()) {
console.log(key)
}
However, everything I have tried has only resulted in the keys id and data.
I can manually get the function and run it just fine:
let item = new MyClass()
item["GET /data"]()
But it does not show up in any dynamic enumeration I have tried.
Manually setting the enumeration also works:
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"]
But that defeats the purpose of doing it dynamically. Is there any way to either dynamically get the names of functions with string keys, or make every property enumerable?
Solution 1:[1]
Object.getOwnPropertyNames(MyClass.prototype)
gives you
["constructor", "GET /data"]
Solution 2:[2]
There are two ways to do this
Object.keys(myObj)
or
for (let key in myObj) {
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Heiko Theißen |
| Solution 2 | ControlAltDel |
