最近碰上這個問題,查了很多資料
在以往版本創建類時,我們可以輕松地使用私有變量及方法
例如:
function Constructor(param){
var that = this;
var private = //..
this.public = //..
this.method = function () {
console.log(private);
console.log(this.public);
}
}
因為整個構造函數在一個作用域內,於是我們就可以在任意一個方法中訪問到外部作用域的私有成員。
但是使用 class 關鍵字創建類時,構造函數和方法是分開的,而且在 class 中直接寫代碼也是不符合語法的,所以使用私有成員就是一件很難辦到事情。
換言之,class 中的構造函數和方法的直接外部作用域就是 class 的直接外部作用域,如果在全局,那就是全局作用域,作為一個 class ,總不能讓他依賴外部的作用域吧?
查資料的過程中發現很多人都在用這種方法
我隨便貼兩張:
它們的思路是,在 class 外部再包一層 function,然后將 class 作為閉包傳遞出來,這樣 class 訪問的直接外部作用域就是閉合的了。
我就很不理解,為什么這么多人都在說這種方法,他可是有一個很大的缺陷的:class 的外部作用域唯一,即多個實例間會公用一套私有變量。
但是我總是對自己不夠自信,以為是一些神奇的機制,而我並不了解這些機制。
於是我動手試了試,發現多個實例間的確會沖突。。
我思來想去,這個思路唯一可行的辦法就是,每次實例化對象時必須重新創造一個外部作用域
代碼:
function Constructor(param) {
var that = this;
var privateVar = //..
var privateFun = function () {
console.log(that);
}
return new class {
constructor() {
this.public = param;
}
method(){
console.log(private);
console.log(this.public);
}
}();
}
這樣雖然可以解決問題,但是構建的復雜性就高了許多,而且每次實例化對象時實際上是通過一個新類來實例化的,總有占了小便宜吃大虧的感覺。
目前還沒有什么好的辦法,如果解決了我會回來更新,如果有大佬知道如何做到這一點,請不吝賜教。
慚愧,剛知道在新標准中已經存在私有成員的概念了,而且主流瀏覽器也都基本實現了
class {
#private = //..
constructor() {
this.public = param;
}
method(){
console.log(this.#private);
console.log(this.public);
}
}