儘管JavaScript在2015年就有了類,但仍然沒有私有字段和私有方法。由於TC39委員會內部存在分歧,這些功能在最初版本中被取消。有三個規範草案打算在不久的將來將這些功能引入到JavaScript類中。
一旦這些規範被正式接受,就可以使用“#”符號來定義私有字段和私有方法。之所以決定使用‘#’符號而不是傳統的下劃線“_”,是爲了避免對現有庫造成太大影響,現在的庫已經使用下劃線來標記私有字段。
儘管現有的庫使用下劃線將字段或方法標記爲私有,但開發人員仍然可以訪問它們。將這些變量變成真正的私有可能會破壞很多現有的應用程序,從而降低新規範的採用速度。
React中的一些東西可以用來說明這個問題。React是一個流行的JavaScript框架,它不得不使用一些直白的變量名來阻止開發人員使用它們(儘管這些變量名被標記爲私有),比如“_SECRET_DOM_DO_NOT_USE_ORYOU_WILL_BE_FIRED”。
TC39的每個提案分別與類私有字段和私有方法的某個方面有關。不過將它們作爲一個整體提案應該是沒問題的,因爲它們很可能同時被添加到JavaScript中。提案內容如下:
類字段聲明
目前在JavaScript中還不能直接定義類字段,開發人員是在構造函數中定義這些字段的。
class Counter {
constructor() {
this.xValue = 0;
}
}
該提案增加了直接在類中定義公共和私有字段的能力。
class Counter {
xValue = 0;
#yValue = 0;
constructor() { }
}
類的私有方法和GETTER/SETTER方法
該提案與私有方法的添加和私有getter/setter的使用有關。
class Counter {
get #x() { return #xValue; }
set #x(value) { }
#clicked() { }
}
類的靜態特性
該提案定義了私有和公共靜態字段/方法的使用方式。
class CustomDate {
static public() = {}
static #private() = {}
}
需要注意的是,過度使用私有字段和私有方法可能會對代碼庫造成不利影響。私有方法不能使用單元測試進行測試,並且通常帶有單一職責原則固有的問題。
私有字段和私有方法還沒有正式被JavaScript接受,但開發人員已經可以在Babel中使用它們了。TypeScript的實現版本目前正在開發當中,未來會發布。
原文鏈接: