2017-05-24 34 views
0

自從我開始使用ES6以來,我一直在使用擴展聲明class ClassB extends ClassA {}來擴展類,並且自從最近那是我看到它的唯一途徑。類之間的差異擴展聲明在Javascript中

另一天,當閱讀文曼文檔時,我注意到他們正在擴展類module.exports = class extends ClassA {}

我認爲這些聲明必須是用不同的方式來表達完全相同的東西。我測試了以下代碼來確認我的懷疑,但它並不像我所希望的那樣清晰:

class ClassA { 
    constructor(width) { 
     this.width = width 
    } 
} 

let ClassB = class extends ClassA { 
    constructor(width, height) { 
     super(width) 
     this.height = height 
    } 
} 

class ClassC extends ClassA { 
    constructor(width, height) { 
     super(width) 
     this.height = height 
    } 
} 

let instanceB = new ClassB(10, 10) 
let instanceC = new ClassC(10, 10) 

當我考察了鍍鉻我注意到,對於變量的構造instanceBinstanceC略有不同的演示:

- instanceB: ClassB 
    - __proto__: ClassA 
     - constructor: class extends 
- instanceC: ClassC 
    - __proto__: ClassA 
     - constructor: class ClassC 

我的問題是這些擴展聲明是否完全相同,儘管它們在檢查員中的描述略有不同?

+0

我建議繼續使用類聲明。您可以在ES6模塊中將它們與'export'或'export default'結合使用。 – Bergi

回答

1

他們所有的實際目的是相同的。考慮

  1. module.exports = class extends ClassA {}
  2. let ClassB = class extends ClassA {}
  3. class ClassC extends ClassA

然後

  • (1)將不具有.name property,而ClassB.name == "ClassB"ClassC.name == "ClassC"
  • (3)將在.toString() method返回的字符串中包含名稱,而另外兩個返回"class extends ClassA {}"(這似乎是Chrome開發工具檢查所基於的內容,我認爲只顯示class extends一個錯誤,並期望它改變 - 也許只是class對於無名類)
+0

Chrome似乎將'ClassB.name'設置爲「ClassB」,並且在控制檯中單擊更多打開的箭頭後顯示IntanceB.contructor的名稱。所以這個「bug」主要是關於控制檯如何操作的。僅供參考Firefox中的'Function.prototype.toString'方法似乎是一個實際的bug,產生函數聲明(或表達式)fpr類聲明(或表達式),在所有情況下都省略「extends _name_」子句。 – traktor53

+0

@ Traktor53是的,實例的命名被推斷得很好,它是構造函數的簡短(未擴展的)表示,它被(imo)破壞。 – Bergi

+0

這也是我最初的想法,但不再(imho)認爲它應該改變:報告「class extends _className_」提供即時信息,該對象是由匿名類_expression_而不是聲明創建的。有多少人會注意到或關心其他問題;-) – traktor53

0

這是因爲你正在將它分配給一個變量。嘗試 class classB extends classA 代替: let classB = class extends...