js保护内部数据的三种方式

js中三种实现私有化内部数据的方式

  1. 通过暴露set和get两个公共api的方式,通过这两个api对内部数据进行操作和保护,规则可以写在get和set方法中

    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对数据属性进行限制

    // 不能设置规则,哪种情况哪些属性可以读写,使用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'; // 不起作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值