2018-01-31 数据劫持

数据劫持 关键点运用Object.defineProperty()函数

function observer(data){
  if(!data || typeof data !== 'object'){
    return;
  }
  // Object.keys遍历对象的属性,不包含原型链上的属性
  Object.keys(data).forEach(key => {
    observerProperty(data, key, data[key]);
  })
}

function observerProperty(data, key, val){
  // 递归
  observer(val);
  Object.defineProperty(data, key, {
    enumerable: true,  // 可以枚举
    configrable: true,   // 可重新定义
    get: function(){
      return val;
    },
    set: function(newVal){
      if(val === newVal){
        return;
      }
      console.log("数据更新啦", val, "=>", newVal);
      val = newVal;
    }
  })
}

var person = {name: "Lucy"};
observer(person);
person.name="Mary";
//输出:数据更新啦 lucy => Mary
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,256评论 0 13
  • 文/文郎画竹 我们经常遇到客户小伙伴有这样的疑问,看了看重大疾病保险条款的疾病种类后,感觉都是快要挂了才理赔,那么...
    文郎画竹阅读 1,090评论 5 6
  • 许多人知道了自己处在火宅之后,便惟愿修行。 当世许多高僧大德们,居士善知识们的大力推动下,人间佛教,网络化佛教,现...
    业明零阅读 5,031评论 0 3
  • 或许,每一份思念都像抛在海里的漂流瓶; 或许,每一份期盼都像想要贮藏的流星; 或许,每一份执著都像触摸不到的空气;...
    Mr_R_glory阅读 167评论 0 0
  • “起初,我还因为这个故事的道理太过浅显而感到恼火,以为我感觉它听起来似乎是我们在小学就学到的。”“后来我才意识到自...
    海滴故事阅读 160评论 0 0