2017-08-03 71 views
1

/A.js具有以下代碼;ES6中的屬性繼承JS類

class A { 
    constructor(token) { 
     this.token = token; 
    } 
    lok() { 
     return 'hello'; 
    } 
} 
module.exports = A 

/dir1/dir2/B.js具有以下代碼;

let A = require(__dirname + '/../../A.js') 
class B extends A { 
    constructor(token) { 
     super(token) 
    } 
    tok() { 
     return this.token; 
    } 
} 
module.exports = B 

問題是,我該如何從類A繼承令牌屬性,

let init = new A('123') 
init.tok() //will return token 

而是我的問題是,我該如何繼承一個基類(A)在構造函數中聲明的屬性,所以我可以在一個子類(B)中使用它們。

+1

除非我錯過了一些東西 - 你沒有在任何地方使用'B'類? – Tom

+1

當然,你打算顯示'新B('123')'而不是'新A('123')'? – mscdex

+0

@mscdex B本身沒有標記,它從A繼承了標記,所以我認爲A必須使用標記進行初始化? –

回答

2

執行let init = new A('123')時,您正在創建A類的實例。這意味着init只具有A類的屬性和方法,值得注意的是,意味着init沒有在B上聲明的tok方法。

如果您執行let init = new B('123'),則將創建B類的實例,該實例還繼承A類的屬性。

在構造函數Bsuper(token)意味着A調用構造函數與參數token,所以你設置this.token = token。然後,你可以把你的B -instance init並在其上成功調用tok

let init = new B('123') 
init.tok() // '123' 

你也仍然可以調用lok這個init,因爲任何B實例繼承從A

init.lok() // 'hello' 
+0

謝謝你的解釋! –

2

你問題更多的是因爲A類型的任何對象不是都有tok()方法,因爲這只是在B類。雖然A確實具有token屬性,但它不具有使用該方法檢索它的能力。例如,你可以這樣做:

let init = new A('123') 
// init.tok() // this will never work as the method only exists on `B` objects 
console.log(.init.token); // this will work fine because you add the property in the constructor 
+0

短而甜,很好的解釋!感謝您的時間! –

+0

當然,但@羅賓詹姆斯的答案有一點肉。 :)很高興你選擇了那一個。 – jakerella