js 創建私有變量

一 通過閉包存儲

let CPrivate = function(value){
      let _private = value;
      return {
          getValue:()=> _private,
          setValue:(value)=> {_private = value}
      }
}

二 通過Symbol創建私有變量 - 將私有變量值存儲到實例化的類中

let CPrivate = (
      function(){
            const _private  = Symbol('pv');
            class CPrivate {
                  constructor(value) {
                        this[_private] = value; //初始化私有變量
                  }
                  getValue(){
                        return this[_private]
                  }
                  setValue(value){
                        this[_private] = value;
                  }
            }
            return CPrivate
      })();
let p1 = new CPrivate(''); //私有變量 p1
p1.getValue();// ''
p1.setValue('蝴蝶效應');
p1.getValue(); // '蝴蝶效應'

let p2 = new CPrivate('世界是普遍聯繫的'); //私有變量 p2
p2.getValue();// '世界是普遍聯繫的'
p2.setValue('所以但行好事,莫問前程');
p2.getValue(); // '所以但行好事,莫問前程'

p1.getValue(); // '蝴蝶效應' 所以 p1 和 p2 是兩個單獨的私有變量類

三 通過 WeakMap 創建 私有變量集合 - 將私有化變量值存儲到 WeakMap的數據結構的變量中

let CPrivate = (
    function (){
        const _private = new WeakMap(); // 創建私有變量集合
        class CPrivate {
            constructor(value) {
                _private.set(this,value);
            }
            getValue(){
                return _private.get(this);
            }
            setValue(value){
                _private.set(this,value);
            }
        }
        return CPrivate;
    }
)();

let p1 = new CPrivate(''); //私有變量 p1
p1.getValue();// ''
p1.setValue('質量互變');
p1.getValue(); // '質量互變'

let p2 = new CPrivate('做一個靠譜的人'); //私有變量 p2
p2.getValue();// '做一個靠譜的人'
p2.setValue('凡事有交代,件件有着落,事事有迴音');
p2.getValue(); // '凡事有交代,件件有着落,事事有迴音'

p1.getValue(); // '質量互變' 所以 p1 和 p2 是兩個單獨的私有變量類

利用WeakMap 存儲 私有變量的好處是 當實例被銷燬時候,改私有變量會被銷燬。或者利用 WeakMap 中的clear方法,統一銷燬所有私有變量,防止閉包引起的 可能內存泄露問題。

四 利用ES 新提案 創建私有變量

class CPrivate {
      #x;
      constructor(value) {
            this.#x = value;
      }
      getValue(){
            return this.#x;
      }
      setValue(value){
            this.#x = value
      }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章