2016-12-27 107 views
2

閱讀Dr. Axel Rauschmayer's blog on ES6 classes,我明白,一個派生類時沒有提供什麼時候需要從構造函數調用`super`?

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

我也明白,如果我想在構造函數中使用this我首先需要調用super下面的默認構造函數,否則this會尚未初始化(拋出一個ReferenceError)。

constructor(width, height) { 
    this.width = width; // ReferenceError 
    super(width, height); 
    this.height = height; // no error thrown 
    ... 
} 

下面的假設是否正確? (如果沒有,可以請你解釋下我應該明確地調用super條件)

派生類的,我只需要顯式調用super時...

  1. 我需要從訪問this在構造函數中
  2. 父類的構造需要不同的參數,然後派生類的構造

還有沒有其他的時候,我應該包括一個電話到超類的構造函數?

+0

不,沒有。你想爲這種說法提供什麼樣的「證明」? –

+0

當你讓一個類像'class ABC extends DEF {...'那麼你必須把'super(...args);',因爲你剛纔用'extends DEF'表示你想從它派生出來。如果你不是從任何類派生的,那麼就不要在ABC的構造函數中放入'超級'。就這麼簡單。 – Azamantes

+1

@Azamantes:如果父類與子類具有相同的參數,則不需要調用「super」。 –

回答

5

是的,這聽起來是正確的,雖然有點奇怪的公式化。這些規則應該是

  • 在派生類中,你總是 需要調用super(…)構造
  • 如果沒有比默認的構造函數做更多,你可以省略整個constructor(){}, 這反過來會使你的班級代碼不包含超級通話。

1:你並不需要調用它的明確return可疑邊緣情況荷蘭國際集團的對象,​​你很少會。

1

你需要調用super在子類的構造函數在這些情況下:

  • 要引用this在子類的構造
  • 你沒有在子類構造函數返回一個不同的對象

在其他情況下,如果您想要超類構造函數運行,您可以調用它,但您不必。

class SuperClass{ 
 
    constructor() { 
 
    console.log('SuperClass'); 
 
    } 
 
} 
 
class SubClass1 extends SuperClass { 
 
    constructor() { 
 
    console.log('SubClass1'); 
 
    super(); 
 
    return {}; 
 
    } 
 
} 
 
class SubClass2 extends SuperClass { 
 
    constructor() { 
 
    console.log('SubClass2'); 
 
    return {}; 
 
    } 
 
} 
 
new SubClass1(); 
 
new SubClass2();

我沒有看到的參數的順序決定是否應該調用super與否時如何重要。

+0

當我想在子類中的任何地方引用'this'?或者只是在子類構造函數中的任何地方? – sfletche

+0

@sfletche是的,他的意思是構造函數 – Bergi

+0

@sfletche類中的其他東西只是方法,我的意思是構造函數,是的。 – Oriol

相關問題