2016-12-06 25 views
3

我的示例類:是在JS ECMAScript 6中繼承的構造函數嗎?

class Something{ 
    constructor(x, y){ 
     this.x = x; 
     this.y = y; 
    } 

    //... 
} 

當我會讓繼承類是這樣的:

class Dog extends Something{ 
    constructor(name){ 
     this.name = name; 
    } 

    //... 
} 

威爾狗的構造這個樣子的?

constructor(x, y, name){ 
    this.x = x; 
    this.y = y; 
    this.name = name; 
} 

如果沒有,是否可以使它像這樣工作^?

+0

您需要創建它明確使用'super'犬的構造像'超(X,Y);' – Andrey

+0

你試試這個代碼?它會拋出一個異常,因爲你遺漏了'super'。 – loganfsmyth

回答

7

是在JS ECMAScript 6中繼承的構造函數嗎?

不是,沒有。但是如果你根本沒有提供構造函數,那麼JavaScript引擎提供的默認行爲就像繼承的構造函數。 (您的例子不相關,您所提供的Dog構造函數)。

威爾狗的類這個樣子的?

不是。因爲您已在Dog中定義構造函數,所以JavaScript引擎不會爲您執行任何操作;您可以定義Dog的構造函數,並通過super調用Something的位置(並且在調用super之前不能使用this)。

Dog構造需要或者接受xy,或硬編碼自己的(或者從它得到的參數得出它們):

接受他們:

class Dog extends Something{ 
    constructor(name, x, y) { 
     super(x, y); 
     this.name = name; 
    } 

    //... 
} 

硬編碼:

// Accepting them: 
class Dog extends Something{ 
    constructor(name) { 
     super(42, 57); 
     this.name = name; 
    } 

    //... 
} 

(或當然,只接受xy和硬編碼/導出另外一個。)


如果你不提供constructor可言,JavaScript引擎adds one for you

對於基類,它看起來像這樣:

constructor() { 
} 

派生類,它看起來像這樣:

constructor(...args) { 
    super(...args); 
} 

那後者就是爲什麼我說這是一個有點像具有繼承因爲不像Java或C#這樣的默認構造函數不接受任何參數並且調用super而沒有參數的語言,JavaScript默認傳遞它接收的所有參數。

+0

謝謝,這是有幫助的,現在我明白了。當我能夠做到時(約10分鐘),我會接受你的回答, –

1

你應該叫明確使用

super(x, y); 

基類的構造函數,以獲得所需的行爲。

0

確實如此,2015年的ECMAScript:

class Animal { 
    constructor() { 
    console.log("Hello"); 
    } 
} 

class Dog extends Animal {} 

var d = new Dog(); // Prints "Hello"