[ECMAScript] Public Class Fields

Public Class Fields是目前處于Stage 2的ECMAScript特性,用于便捷的為class聲明字段(fields),例如:

class A {
    a = 1;
    static b=2;

    constructor() {
        this.a    //1
    }
}

A.b    //2
new A;

其中症概,
(1)Public Class Fields的語法是a=1幔荒,而不是a:1
(2)字段aconstructor的函數(shù)體執(zhí)行之前就已經(jīng)賦值為1了邢锯。

我們?nèi)绾未_認(rèn)這兩點(diǎn)呢?


1. 規(guī)范

找到Public Class Fields規(guī)范:https://tc39.github.io/proposal-class-public-fields/

2. 語法

Public Class Fields引入新的產(chǎn)生式(productions)和靜態(tài)語義(static semantics)搀别,
語法方面丹擎,我們只看這個新的產(chǎn)生式:

PublicFieldDefinition : 
    PropertyName Initializer

非終結(jié)符(nonterminal symbolsPropertyNameInitializer來自ECMAScript? 2017 Language Specification

PropertyName :
    LiteralPropertyName
    ComputedPropertyName

Initializer : 
    = AssignmentExpression

我們看到Initializer中包含終結(jié)符(terminal symbols)“=”,
因此歇父,符合規(guī)范的語法是a=1蒂培,而不是a:1

關(guān)于Static Public Class Fields庶骄,詳見Class Definitions語法:

3. 語義

為了確定是否在constructor的函數(shù)體執(zhí)行之前毁渗,Public Class Fields已經(jīng)被賦值了。
可以參考Public Class Fields規(guī)范新增的Runtime Semantics / Dynamic Semantics单刁。

內(nèi)部函數(shù)[[Construct]] ( argumentsList, newTarget )原意是為了說明灸异,把函數(shù)作為構(gòu)造函數(shù)來調(diào)用時發(fā)生的事情。在這里羔飞,可以用來表明調(diào)用classconstructor時發(fā)生了什么肺樟,此時F就是constructor函數(shù),argumentsList就是constructor的參數(shù)列表逻淌,newTarget就是constructor函數(shù)中的this么伯。(可參考,ECMAScript? 2017 Language Specification: 9.2.2 [[Construct]] ( argumentsList, newTarget )卡儒。

Public Class Fields規(guī)范對[[Construct]] ( argumentsList, newTarget )進(jìn)行了修改田柔,
增加了InitializePublicInstanceFields(thisArgument, F)俐巴。

我們看到InitializePublicInstanceFieldsOrdinaryCallEvaluateBody之前執(zhí)行,
其中硬爆,OrdinaryCallEvaluateBody做的事情就是求值classconstructor函數(shù)體欣舵。

下面我們分兩個步驟理解InitializePublicInstanceFields做的事情:

(1)InitializePublicInstanceFields

這個內(nèi)部函數(shù)先從constructor中讀取內(nèi)部屬性(internal slot)[[PublicFields]]
然后逐個對Public Class Fields求值,把結(jié)果保存成多個屬性desc缀磕,然后設(shè)置給O缘圈。
constructor就是InitializePublicInstanceFields(thisArgument, F)中的F
O就是InitializePublicInstanceFields(thisArgument, F)中的thisArgument袜蚕。

上文中我們看到InitializePublicInstanceFieldsOrdinaryCallEvaluateBody之前執(zhí)行糟把。
這說明,在求值class的構(gòu)造函數(shù)constructor的函數(shù)體之前牲剃,
this(即thisArgument)已經(jīng)被設(shè)置了Public Class Fields屬性(即desc)遣疯。
因此,字段aconstructor的函數(shù)體執(zhí)行之前就已經(jīng)賦值為1了颠黎。

(2)[[PublicFields]]

這個內(nèi)部屬性(internal slot)是在class定義的時候生成的另锋。
Public Class Fields規(guī)范:2.1.3 Runtime Semantics: ClassDefinitionEvaluation

ClassPublicFields內(nèi)部函數(shù)根據(jù)產(chǎn)生式(productions)得到一個語法上的ClassElement列表(list)。
ClassPublicFieldDefinitionEvaluation會根據(jù)語法生成一個內(nèi)部的數(shù)據(jù)結(jié)構(gòu)Record狭归。
ClassPublicFieldsClassPublicFieldDefinitionEvaluation的具體定義如下:



參考

Github: tc39/proposals
Public Class Fields
ECMAScript? 2017 Language Specification

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市文判,隨后出現(xiàn)的幾起案子过椎,更是在濱河造成了極大的恐慌,老刑警劉巖戏仓,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疚宇,死亡現(xiàn)場離奇詭異,居然都是意外死亡赏殃,警方通過查閱死者的電腦和手機(jī)敷待,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仁热,“玉大人榜揖,你說我怎么就攤上這事】勾溃” “怎么了举哟?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迅矛。 經(jīng)常有香客問我妨猩,道長,這世上最難降的妖魔是什么秽褒? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任壶硅,我火速辦了婚禮威兜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庐椒。我一直安慰自己椒舵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布扼睬。 她就那樣靜靜地躺著逮栅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窗宇。 梳的紋絲不亂的頭發(fā)上措伐,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音军俊,去河邊找鬼侥加。 笑死,一個胖子當(dāng)著我的面吹牛粪躬,可吹牛的內(nèi)容都是我干的担败。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼镰官,長吁一口氣:“原來是場噩夢啊……” “哼提前!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泳唠,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤狈网,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笨腥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拓哺,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年脖母,在試婚紗的時候發(fā)現(xiàn)自己被綠了士鸥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡谆级,死狀恐怖烤礁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哨苛,我是刑警寧澤鸽凶,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站建峭,受9級特大地震影響玻侥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亿蒸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一凑兰、第九天 我趴在偏房一處隱蔽的房頂上張望掌桩。 院中可真熱鬧,春花似錦姑食、人聲如沸波岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽则拷。三九已至,卻和暖如春曹鸠,著一層夾襖步出監(jiān)牢的瞬間煌茬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工彻桃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坛善,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓邻眷,卻偏偏與公主長得像眠屎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肆饶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法改衩,類相關(guān)的語法,內(nèi)部類的語法驯镊,繼承相關(guān)的語法燎字,異常的語法,線程的語...
    子非魚_t_閱讀 31,596評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理阿宅,服務(wù)發(fā)現(xiàn),斷路器笼蛛,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法洒放,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 1,965評論 0 3
  • Introduction to C++ (Season 1) Unit 1: Overview of C++ 第1...
    我是阿喵醬閱讀 2,733評論 0 7
  • 他 暴跳著 砸了電話機(jī) 因?yàn)樗?從不接他電話 她永遠(yuǎn)在躲避 有什么好鬧的呢 她從未愛過你 是誰給你這個權(quán)利 她可以...
    雪莉詩話閱讀 314評論 5 18