js保護內部數據的三種方式

js中三種實現私有化內部數據的方式

  1. 經過暴露set和get兩個公共api的方式,經過這兩個api對內部數據進行操做和保護,規則能夠寫在get和set方法中api

    function Person = {
      var data = {
        name: 'es3',
        sex: 'female',
        age: 12
      };
      this.get = function (key) {
        return data[key];
      }
      this.set = function (key, value) {
        if (key !== 'sex') {
          data[key] = value;
        }
      }
    };
    var person = new Person();
    console.table({
      name: person.get('name'),
      sex: person.get('sex'),
      age: person.get('age')
    });// name: 'es3', sex: 'female', age: 12
    person.set('sex', 'male'); // person.get('sex') === 'female' 對set作了判斷,因此設置沒用,這樣就經過定義實例的 set和get方式來保護 內部的data變量
  2. 直接使用 defineProperty對數據屬性進行限制this

    // 不能設置規則,哪一種狀況哪些屬性能夠讀寫,使用defineProperty就搞不定
    var Person = {
      name: 'es3',
      sex: 'female',
      age: 12
    };
    Object.defineProperty(Person, 'sex', {
      writable: false,
      value: 'female'
    });
    Person.sex = 'male'; // Person.sex === female; 會失敗,嚴格模式會報錯。
  3. 使用 Proxy 對象代理代理

    var Person = {
      name: 'es3',
      sex: 'female',
      age: 12
    };
    let person = new Proxy(Person, {
      get(target, key) {
        // target就是 Person, key就是屬性,這裏也能夠定義規則
        return target[key];
      },
      set(target, key, value) {
        // 能夠在這裏進行各類規則設置
        if (key !== 'sex') {
          target[key] = value;
        }
      }
    });
    person.sex = 'male'; // 不起做用
相關文章
相關標籤/搜索