Ich versuche herauszufinden, was hier vor sich geht, da die Parent/Super-Klasse nach der ersten Konstruktion keine Daten mehr hat.ES6: Superklasse hält keinen Zustand
// Importe/Server/a-and-b.js
class A {
constructor(id) {
// make MongoDB call and store inside this variable
// ...
this._LocalVariable = FieldFromMongo;
console.log(`this._LocalVariable: ${this._LocalVariable}`); // => This has a good value, ie: 'Test'
}
get LocalVar() {
console.log(`this._LocalVariable: ${this._LocalVariable}`); // => This has a undefined value when called from child class
return this._LocalVariable;
}
}
export class B extends A {
constructor(id) {
super(id);
this.TEST = 'THIS IS A TEST';
}
get THE_Variable() {
console.log(`super.LocalVar: ${super.LocalVar}`); // => This has a undefined value when called
return super.LocalVar;
}
get GETTHEVAR() {
return this.TEST; // => This returns 'THIS IS A TEST'
}
}
// Importe/server/factory.js
import { B } from 'imports/server/a-and-b.js';
class Factory {
constructor() {
this._factory = new Map();
}
BuildInstances(id, cls) {
let instance = this._factory.get(cls);
if (!instance) {
if (cls === 'B') {
instance = new B(id);
this._factory.set(cls, instance);
return instance;
}
}
else {
return instance;
}
}
}
export let OptsFactory = new Factory();
// Importe/server/test.js
import { OptsFactory } from 'imports/server/factory.js'
const B = OptsFactory.BuildInstances(id, 'B');
const THE_Variable = B.THE_Variable; // => always undefined
const TEST = B.GETTHEVAR; // => Always returns 'THIS IS A TEST'
Warum hält die Klasse A den Status nicht?
Klingt wie Ihr MongoDB-Aufruf asynchron ist und Sie erwarten, einen synchronen Wert zu erhalten. Können Sie einen Beispielcode angeben, der zeigt, wie Sie diesen Wert von der Datenbank erhalten? –
Der Wert kommt tatsächlich von Mongo zurück, ich sehe es in der console.log, im obigen Code ist es diese Zeile: console.log ('this._LocalVariable: $ {this._LocalVariable}'); // => Das hat einen guten Wert, zB: 'Test'. Nur wenn ich es von der Child-Klasse aus anrufe, ist es undefiniert - als würde es nie seinen eigenen Status setzen oder wie die Child-Klasse nicht die richtige Referenz hält? – Aaron
Wirklich schwer, diesem Problem zu folgen, insbesondere mit der Verwendung von Pseudo-Code wie Namen und keine tatsächliche Funktionalität. Mit 'super.XXX' greifen Sie nicht auf Instanzdaten zu. Sie benutzen 'this.XXX'. Es gibt nur ein Objekt, einen "this" -Zeiger und alle Teile der Klasse (Basis- und abgeleitete Klassen) greifen alle auf das gleiche Objekt und den gleichen "this" -Zeiger zu. So greift 'this.XXX' auf eine Eigenschaft zu, unabhängig davon, welcher Teil der Basisklasse oder abgeleiteten Klasse sie erstellt oder festgelegt hat. – jfriend00