2017-05-26 85 views
0

我想弄清楚這裏發生了什麼,因爲父類/超類在初始構建後沒有數據。ES6:超級類不保持狀態

//進口/服務器/一 - 和 - 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' 
    } 
} 

//進口/服務器/ 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(); 

//進口/服務器/ 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' 

爲什麼A類不能保持狀態?

+1

聽起來像你的MongoDB調用是異步的,你期望得到一個同步值。你能否提供一些示例代碼來說明你如何從數據庫中獲得價值? –

+0

這個值實際上是從Mongo返回的,我在console.log中看到它,在上面的代碼中,它是這一行:console.log('this._LocalVariable:$ {this._LocalVariable}'); // =>這有一個很好的價值,即:'測試'。只有當我從Child類中調用它時,它纔是未定義的 - 就像它從未設置它自己的狀態或像Child類沒有保留適當的引用一樣? – Aaron

+0

真的很難遵循這個問題,特別是使用類似名稱的僞代碼並且沒有真正的實際功能。你不用'super.XXX'來訪問實例數據。你使用'this.XXX'。只有一個對象,一個'this'指針和類的所有部分(基類和派生類)都訪問相同的對象和相同的'this'指針。因此,無論基類或派生類的哪一部分創建它或設置它,this.XXX都會訪問一個屬性。 – jfriend00

回答

0

這是我發現:

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' 
    } 
} 

所以基本上是工作的事情是節日禮物樣式4工作。

+1

您可以使用'this.xxx'而不是'super.xxx'來訪問實例數據。只有一個對象和一個'this'表示該類的所有部分都使用該功能,不管該功能是在基類還是派生類中。 – jfriend00

+0

是的,即使父母初始化財產似乎。 – Aaron

+2

該屬性如何設置並不重要。只有一個對象,因此只有一個'this'。它可以從基類,派生類或對象之外通過對象引用進行設置。這只是一個對象。人們似乎認爲每個類在實例化時都會初始化它自己的獨立對象,但事實並非如此。這只是一個對象。 – jfriend00