2017-05-26 48 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