成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

類靜態初始化塊即將納入ES2022,我們先一睹為快

開發 前端
對于類的靜態部分的設置,我們只有靜態字段。ECMAScript建議為類引入靜態初始化塊,大致上,它對靜態類的作用就像構造函數對實例的作用。

[[436293]]

Ron Buckton 提出的 ECMAScript 提案 "類靜態初始化塊"已進入第四階段,計劃納入ECMAScript 2022。

為了建立一個類的實例,在JavaScript中有兩個結構:

字段:創建(可選擇初始化)實例屬性。

構造函數:在 setup 完成之前執行的代碼塊。

對于類的靜態部分的設置,我們只有靜態字段。ECMAScript建議為類引入靜態初始化塊,大致上,它對靜態類的作用就像構造函數對實例的作用。

[[436294]]

1.為什么我們需要類中的靜態塊?

在設置靜態字段時,使用外部函數通常也可以很好地工作:

  1. class Translator { 
  2.   static translations = { 
  3.     yes: 'ja'
  4.     no'nein'
  5.     maybe: 'vielleicht'
  6.   }; 
  7.   static englishWords = extractEnglish(this.translations); 
  8.   static germanWords = extractGerman(this.translations); 
  9. function extractEnglish(translations) { 
  10.   return Object.keys(translations); 
  11. function extractGerman(translations) { 
  12.   return Object.values(translations); 

使用外部函數 extractEnglish()和 extractGerman() 在這種情況下效果很好,因為我們可以看到它們是從類內部調用的,而且它們完全獨立于類。

如果我們想同時設置兩個靜態字段,事情就變得不那么優雅。

  1. class Translator { 
  2.   static translations = { 
  3.     yes: 'ja'
  4.     no'nein'
  5.     maybe: 'vielleicht'
  6.   }; 
  7.   static englishWords = []; 
  8.   static germanWords = []; 
  9.   static _ = initializeTranslator( // (A) 
  10.     this.translations, this.englishWords, this.germanWords); 
  11. function initializeTranslator(translations, englishWords, germanWords) { 
  12.   for (const [english, german] of Object.entries(translations)) { 
  13.     englishWords.push(english); 
  14.     germanWords.push(german); 
  15.   } 

這一次,有幾個問題。

  • 調用initializeTranslator()是一個額外的步驟,要么在創建類之后,在類之外執行?;蛘咄ㄟ^一個變通方法來執行(A行)。
  • initializeTranslator() 不能訪問 Translator 的私有數據。

通過提出的靜態塊(A行),我們有更優雅的解決方案。

  1. class Translator { 
  2.   static translations = { 
  3.     yes: 'ja'
  4.     no'nein'
  5.     maybe: 'vielleicht'
  6.   }; 
  7.   static englishWords = []; 
  8.   static germanWords = []; 
  9.   static { // (A) 
  10.     for (const [english, german] of Object.entries(this.translations)) { 
  11.       this.englishWords.push(english); 
  12.       this.germanWords.push(german); 
  13.     } 
  14.   } 

2.一個更復雜的例子

在JavaScript中實現枚舉的一種方法是通過帶有輔助功能的超類Enum

  1. class Enum { 
  2.   static collectStaticFields() { 
  3.     // Static methods are not enumerable and thus ignored 
  4.     this.enumKeys = Object.keys(this); 
  5.   } 
  6. class ColorEnum extends Enum { 
  7.   static red = Symbol('red'); 
  8.   static green = Symbol('green'); 
  9.   static blue = Symbol('blue'); 
  10.   static _ = this.collectStaticFields(); // (A) 
  11.  
  12.   static logColors() { 
  13.     for (const enumKey of this.enumKeys) { // (B) 
  14.       console.log(enumKey); 
  15.     } 
  16.   } 
  17. ColorEnum.logColors(); 
  18.  
  19. // Output
  20. // 'red' 
  21. // 'green' 
  22. // 'blue' 

我們需要收集靜態字段,以便我們可以遍歷枚舉項的鍵(B行)。這是在創建所有靜態字段之后的最后一步。我們再次使用一個變通方法(A行),靜態塊會更優雅。

3.詳情

靜態塊的具體內容相對來說是合乎邏輯的(相比之下,實例成員的規則更為復雜):

  • 每個類可以有一個以上的靜態塊。
  • 靜態塊的執行是與靜態字段初始化器的執行交錯進行的。
  • 超類的靜態成員在子類的靜態成員之前被執行。

下面的代碼展示了這些規則:

  1. class SuperClass { 
  2.   static superField1 = console.log('superField1'); 
  3.   static { 
  4.     assert.equal(this, SuperClass); 
  5.     console.log('static block 1 SuperClass'); 
  6.   } 
  7.   static superField2 = console.log('superField2'); 
  8.   static { 
  9.     console.log('static block 2 SuperClass'); 
  10.   } 
  11.  
  12. class SubClass extends SuperClass { 
  13.   static subField1 = console.log('subField1'); 
  14.   static { 
  15.     assert.equal(this, SubClass); 
  16.     console.log('static block 1 SubClass'); 
  17.   } 
  18.   static subField2 = console.log('subField2'); 
  19.   static { 
  20.     console.log('static block 2 SubClass'); 
  21.   } 
  22.  
  23. // Output
  24. // 'superField1' 
  25. // 'static block 1 SuperClass' 
  26. // 'superField2' 
  27. // 'static block 2 SuperClass' 
  28. // 'subField1' 
  29. // 'static block 1 SubClass' 
  30. // 'subField2' 
  31. // 'static block 2 SubClass' 

4.在引擎中支持類靜態塊

  • V8: unflagged in v9.4.146 (source)
  • SpiderMonkey: behind a flag in v92, intent to ship unflagged in v93 (source)
  • TypeScript: v4.4 (source)

5.JS 是否變得太像Java和/或一塌糊涂?

這是一個很小的功能,不會與其他功能競爭。我們已經可以通過 static _ = ... 的字段來運行靜態代碼。靜態塊意味著這種變通方法不再需要了。

除此之外,類只是JavaScript程序員腰帶上的眾多工具之一。我們中的一些人使用它,另一些人不使用它,而且有許多替代方案。即使是使用類的 JS 代碼,也經常使用函數,而且往往是輕量級的。

[[436295]]

6.總結

類靜態塊是一個相對簡單的功能,它完善了類的靜態功能。粗略來說,它是實例構造函數的靜態版本。它主要在我們需要設置一個以上的靜態字段時有用。

作者:Dr. Axel Rauschmayer 譯者:前端小智

來源:2ality 原文:https://2ality.com/2021/09/class-static-block.html

 

責任編輯:姜華 來源: 大遷世界
相關推薦

2016-12-01 07:53:36

AWSAWS re:InveAWS新產品

2010-02-03 11:01:18

C++類靜態成員初始化

2024-08-26 15:06:20

2022-08-05 13:14:25

ES2022JavaScript代碼

2012-05-23 12:46:53

JavaJava類

2009-08-31 09:47:22

C#靜態變量初始化

2010-08-06 13:51:12

OracleFusionApp

2019-02-20 15:42:28

機器學習人工智能計算機

2012-02-28 10:04:09

Java

2023-11-12 23:08:17

C++初始化

2024-03-08 08:26:25

類的加載Class文件Java

2022-03-23 09:55:14

PythonGUI代碼

2024-03-28 12:32:18

JVM類加載構造器

2012-04-09 13:43:12

Java

2013-03-04 11:10:03

JavaJVM

2013-08-07 09:35:43

政府召車App

2009-08-28 11:24:48

C#一維數組初始化

2022-09-19 00:46:18

JavaScrip功能開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄一区二区三区 | 91精品国产综合久久久密闭 | 国产精品久久久久一区二区三区 | 国产精品成人国产乱 | 九九九视频在线观看 | 精品一区二区三区不卡 | 精品国产乱码久久久久久88av | 日韩在线播放一区 | 久久久久久国产免费视网址 | 久久国产免费看 | www.99热 | 国产一区二区三区色淫影院 | 日韩高清国产一区在线 | av免费观看网站 | 欧美一级在线免费 | 亚洲精品v | 精品一区二区三区在线观看国产 | 日韩一级免费大片 | 国产精品久久久久久久久久 | 中文字幕日韩av | 免费观看一区二区三区毛片 | 国产1区| 一区二区免费在线视频 | 国产精品久久久久久亚洲调教 | 日韩一区二区福利视频 | 久久神马 | 免费播放一级片 | 日韩一区精品 | 久久久国产精品网站 | 欧美亚洲国产一区二区三区 | 亚洲精品久久久久国产 | 国产精品一区二区免费 | www.亚洲 | 日本在线小视频 | 日韩精品在线观看一区二区 | 国产精品视频观看 | 国产一区91精品张津瑜 | 亚洲精品日本 | 久久噜噜噜精品国产亚洲综合 | 99精品免费| 日韩精品一区二区三区在线播放 |