簡體   English   中英

ES6到ES5:Babel實現的類擴展

[英]ES6 to ES5: Babel's implementation of class extension

由於舊的瀏覽器支持,我們都使用babeljs將ES6轉換為ES5。 當babel編譯一個從另一個類擴展的類時。 編譯代碼的一部分類似於:

...
if (superClass)
    Object.setPrototypeOf
      ? Object.setPrototypeOf(subClass, superClass)
      : (subClass.__proto__ = superClass);
...

頂部代碼塊用於擴展父類的靜態屬性。 他們使用Object.setPrototypeOf來改變子類的[[Prototype]] 不要混淆.prototype[[Prototype]]是一個完全獨立的東西。

MDN在其有關使用Object.setPrototypeOf參考資料中所說的內容如下:

根據現代JavaScript引擎如何在每個瀏覽器和JavaScript引擎中優化屬性訪問,非常慢的操作,改變對象的[[Prototype]]。

我的問題出現在這里:如果我們能用另一種方式獲得相同的結果,為什么Babel使用Object.setPrototypeOf 我試圖通過循環構造函數對象從父類(我之前分配給它)復制所有靜態方法。

...
var parentStaticProps = parentClass.prototype.constructor;

for (var prop in parentStaticProps) {
  childClass.prototype.constructor[prop] = parentStaticProps[prop];
}
...

它也比babel的實施更快! 我創建了類似於babel擴展類並在jsPerf中測試它的東西 對於Object.setPrototypeOf我的前5個測試運行結果非常令人失望:慢19%,慢20%,慢3倍21%。

我知道Object.setPrototypeOf可能需要使用的原因。 我想知道。 如果它是關於非可枚舉的屬性,那么我們肯定可以使用其他一些方法。

如果我們可以用另一種方式獲得相同的結果,為什么Babel使用Object.setPrototypeOf

僅僅因為沒有其他方法可以達到相同的結果。 只是復制所有屬性的當前值與從另一個對象動態繼承不同。 巴別塔的目標是正確,而不是快速。

它也比babel的實施更快! 我創建了類似於babel擴展類並在jsPerf中測試它的東西。

好吧,創建和擴展類慢,並不重要。 使用這些類 - 例如訪問靜態屬性 - 是這里的重要方面。 通常沒有問題是你改變了一個新的(未使用的)對象的[[prototype]] - 警告更關心的是在對象生命周期的中間進行變異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM