Normalerweise verwende ich den nächsten Satz, um alle Objektfelder zu erhalten, aber ich habe gerade festgestellt, dass dies Objekt-Getter überspringt

Object.entries(myInstance) 

Ich habe es auch ohne Ergebnisse versucht:

Object.keys(myInstance)
Object.values(myInstance)

Gibt es eine Möglichkeit, die Objektattribute UND Getter zu durchlaufen? Ich interessiere mich für den Namen und den Wert des Getters, nicht für die Funktion selbst.

0
Nasgar 19 Feb. 2020 im 17:16

3 Antworten

Beste Antwort

Sie können den Getter auch mit Object.defineProperty aufzählbar machen, um die Instanz mit der Konfiguration zu definieren, damit sie aufzählbar ist. Ersetzen Sie "dies" durch einen Verweis auf Ihr Objekt unten.

Object.defineProperty(this, 'getterName' {
   enumerable: true,
   get: function() {
       return 'value'
   }
}

MDN: Object.defineProperty

0
lkroneman 19 Feb. 2020 im 14:30
Object.getOwnPropertyNames

Aus MDN-Webdokumenten: "Die Object.getOwnPropertyNames () -Methode gibt ein Array aller Eigenschaften zurück (einschließlich nicht aufzählbarer Eigenschaften mit Ausnahme derjenigen, die Symbol verwenden)."

1
izambl 19 Feb. 2020 im 14:21

Wenn eine Klassendeklaration eine Methode oder einen Getter definiert, werden diese im Prototyp definiert und sind nicht aufzählbar.

Das heißt, sie werden weder in Object.keys, Object.getOwnPropertyNames (sie werden keine Prototypen nachschlagen) noch in einer for..in - Schleife angezeigt (es werden nicht aufzählbare Eigenschaften übersprungen).

Sie haben drei Möglichkeiten:

  • Machen Sie den Getter aufzählbar:
class Foo{
  /* contents of class */
}
Object.defineProperty(Foo.prototype, 'bar', {
  get: () => 'baz',
  enumerable: true,
  configurable: false //Or true
})
for(const prop in new Foo){
  console.log(prop)
}
  • Definieren Sie den Getter für Instanzen:
class Foo{
  constructor() {
     Object.defineProperty(this, 'bar', {
      get: () => 'baz',
      enumerable: false,
      configurable: false //Or true
    })
  }
  /* contents of class */
}
console.log(Object.getOwnPropertyNames(new Foo)
  • Implementieren Sie einen benutzerdefinierten Suchalgorithmus:
class Foo{
  get bar(){return 'baz'}
  /* class contents here */
}
Object.getAllProperties = obj => (obj != null //not null or undefined 
  ? [ 
    ...Object.getOwnPropertyNames(obj),
    ...Object.getOwnPropertySymbols(obj),
    ...Object.getAllProperties(Object.getPrototypeOf(obj))
  ] 
  : []
)

console.log(Object.getAllProperties(new Foo))
1
FZs 20 Feb. 2020 im 11:40