2017-05-26 3 views
0

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?

+1

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? –

+0

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

+0

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

Antwort

0

das ist, was ich gefunden habe:

class A { 
    constructor(id) { 
    // make MongoDB call and store inside this variable 
    // ... 
    this._LocalVariable = FieldFromMongo; 
    } 
    get LocalVar() { 
    return this._LocalVariable; 
    } 
    GetThatLocalVar() { 
    return this._LocalVariable; 
    } 
} 

export class B extends A { 
    constructor(id) { 
    super(id); 
    } 
    get Style1() { 
    // Reference to Parent get function 
    return super.LocalVar; // => This has a undefined value when called 
    } 
    get Style2() { 
    // Reference to Parent property 
    return super._LocalVariable; // => This has a undefined value when called 
    } 
    get Style3() { 
    // Reference to local Property that is declared in Parent 
    return this._LocalVariable; // => This works 
    } 
    get Style4() { 
    // Reference to Parent without the getter 
    return super.GetThatLocalVar(); // => This works 
    } 
    get GETTHEVAR() { 
    return this.TEST; // => This returns 'THIS IS A TEST' 
    } 
} 

die Sache Also im Grunde die Style3 Style 4 Arbeit funktioniert.

+1

Sie greifen mit 'this.xxx' auf Instanzdaten zu, nicht mit' super.xxx'. Es gibt nur ein Objekt und ein "This", das von allen Teilen der Klasse verwendet wird, unabhängig davon, ob die Funktionalität in der Basisklasse oder in einer abgeleiteten Klasse liegt. – jfriend00

+0

Ja, auch wenn das Parent die Eigenschaft initialisiert scheint. – Aaron

+2

Es spielt keine Rolle, wie die Eigenschaft festgelegt wird. Es gibt nur ein Objekt und somit nur ein "dieses". Es kann von der Basisklasse, von der abgeleiteten Klasse oder von außerhalb des Objekts über die Objektreferenz gesetzt werden. Es ist alles nur ein Objekt. Die Leute scheinen zu denken, dass jede Klasse ihr eigenes separates Objekt initialisiert, wenn es instanziiert wird, aber das ist nicht der Fall. Es ist nur ein Objekt. – jfriend00

Verwandte Themen