对象代理(数据隐私保护)

学c++和java的时候,我们都可以快速方便地定义私有属性,但在js里面要定义私有属性就比较麻烦了。

es5中可以依靠Object.defineProperty()这个方法定义私有属性。

         var Person = {
            name:'haha',
            age:15
          }

          Object.defineProperty(Person,'sex',{
            writable:false,//设为只读
            value:'male'
          });

          try{
            Person.sex = 'female';
            console.log(Person.sex);//sex属性还是male,并没有被改掉
          }catch(e){
            console.log(e);
          }

在es6中我们可以使用对象代理,中间加个代理层来定义私有属性。

         let Person = {
            name:'haha',
            sex:'male',
            age:15
          };

          let person = new Proxy(Person,{
            get(target,key){
              return target[key]
            },
            set(target,key,value){
              if(key!=='sex'){
                target[key]=value;
              }
            }
          });

          try{
            person.sex = 'female';
            console.log(Person.sex);//sex属性还是male,并没有被改掉
          }catch(e){
            console.log(e);
          }

Proxy是es6提供的新方法。
使用代理的方式,用户操作的其实是person,而不是Person,这种方式可以在代理层中定义很多逻辑复杂的拦截规则,但是不会影响原始对象数据,是个很好的方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,893评论 6 13
  • JavaScript面向对象程序设计 本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学...
    moyi_gg阅读 4,106评论 0 2
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 10,159评论 0 5
  • 0. 写在前面 当你开始工作时,你不是在给你自己写代码,而是为后来人写代码。 —— Nichloas C. Zak...
    康斌阅读 10,742评论 1 42
  • 2015-11-08海纳有容阅读 222 一棵树,又掉下一片叶, 从高高的树梢翻飞, 悄悄地,悄悄地, 坠进无底的...
    海纳有容阅读 1,417评论 1 4