自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
對于類的靜態(tài)部分的設(shè)置,我們只有靜態(tài)字段。ECMAScript建議為類引入靜態(tài)初始化塊,大致上,它對靜態(tài)類的作用就像構(gòu)造函數(shù)對實(shí)例的作用。

[[436293]]

Ron Buckton 提出的 ECMAScript 提案 "類靜態(tài)初始化塊"已進(jìn)入第四階段,計劃納入ECMAScript 2022。

為了建立一個類的實(shí)例,在JavaScript中有兩個結(jié)構(gòu):

字段:創(chuàng)建(可選擇初始化)實(shí)例屬性。

構(gòu)造函數(shù):在 setup 完成之前執(zhí)行的代碼塊。

對于類的靜態(tài)部分的設(shè)置,我們只有靜態(tài)字段。ECMAScript建議為類引入靜態(tài)初始化塊,大致上,它對靜態(tài)類的作用就像構(gòu)造函數(shù)對實(shí)例的作用。

[[436294]]

1.為什么我們需要類中的靜態(tài)塊?

在設(shè)置靜態(tài)字段時,使用外部函數(shù)通常也可以很好地工作:

  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); 

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

如果我們想同時設(shè)置兩個靜態(tài)字段,事情就變得不那么優(yōu)雅。

  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.   } 

這一次,有幾個問題。

  • 調(diào)用initializeTranslator()是一個額外的步驟,要么在創(chuàng)建類之后,在類之外執(zhí)行。或者通過一個變通方法來執(zhí)行(A行)。
  • initializeTranslator() 不能訪問 Translator 的私有數(shù)據(jù)。

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

  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.一個更復(fù)雜的例子

在JavaScript中實(shí)現(xiàn)枚舉的一種方法是通過帶有輔助功能的超類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' 

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

3.詳情

靜態(tài)塊的具體內(nèi)容相對來說是合乎邏輯的(相比之下,實(shí)例成員的規(guī)則更為復(fù)雜):

  • 每個類可以有一個以上的靜態(tài)塊。
  • 靜態(tài)塊的執(zhí)行是與靜態(tài)字段初始化器的執(zhí)行交錯進(jìn)行的。
  • 超類的靜態(tài)成員在子類的靜態(tài)成員之前被執(zhí)行。

下面的代碼展示了這些規(guī)則:

  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.在引擎中支持類靜態(tài)塊

  • 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和/或一塌糊涂?

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

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

[[436295]]

6.總結(jié)

類靜態(tài)塊是一個相對簡單的功能,它完善了類的靜態(tài)功能。粗略來說,它是實(shí)例構(gòu)造函數(shù)的靜態(tài)版本。它主要在我們需要設(shè)置一個以上的靜態(tài)字段時有用。

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

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

 

責(zé)任編輯:姜華 來源: 大遷世界
相關(guān)推薦

2016-12-01 07:53:36

AWSAWS re:InveAWS新產(chǎn)品

2010-02-03 11:01:18

C++類靜態(tài)成員初始化

2024-08-26 15:06:20

2012-05-23 12:46:53

JavaJava類

2010-08-06 13:51:12

OracleFusionApp

2009-08-31 09:47:22

C#靜態(tài)變量初始化

2022-08-05 13:14:25

ES2022JavaScript代碼

2019-02-20 15:42:28

機(jī)器學(xué)習(xí)人工智能計算機(jī)

2012-02-28 10:04:09

Java

2024-03-08 08:26:25

類的加載Class文件Java

2023-11-12 23:08:17

C++初始化

2022-03-23 09:55:14

PythonGUI代碼

2012-04-09 13:43:12

Java

2013-03-04 11:10:03

JavaJVM

2024-03-28 12:32:18

JVM類加載構(gòu)造器

2009-08-28 11:24:48

C#一維數(shù)組初始化

2011-07-22 17:46:43

java

2013-08-07 09:35:43

政府召車App
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號