【JavaScript】Class 關鍵字創建類時如何使用私有變量


最近碰上這個問題,查了很多資料

在以往版本創建類時,我們可以輕松地使用私有變量及方法
例如:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM