美文网首页
2017-08-03读书笔记(js监听对象属性改变)

2017-08-03读书笔记(js监听对象属性改变)

作者: shaocx | 来源:发表于2017-08-04 01:37 被阅读0次

今天本来想继续看Webpack,但是无奈公司上线到11点,没有多少时间,就先看一篇别的文章 js监听对象属性改变

公司用的框架是backbone,但是正在转型为react,但是个人非常喜欢backbone中对model的有一个listenTo的方法,可以监听对象的所有变化,就可以在回调函数中直接修改别处的样式。在一个对象渲染于多处却需要挨个修改的情况下,这样可以节省一部分的去寻找并修改的精力,让代码更好读、易理解。

所以在网上广泛的寻找能行的替代解决方案(当然我也不是很清楚react到底有没有类似功能,目前使用程度还不太深)。然后就找到了这篇文章。

文章中提到的方法是用的ES5提供的Object.defineProperty函数。

Object.defineProperty(user, 'name', {
    set:function(key,value){
        //此处拦截了设置请求
    }
});

文章中还讲说,如果为user增加一个新的属性,比如user里没有id属性,增加一个 user.id=1,Object.defineProperty函数是不知道存在'id'的,也就无法写出上面的代码,这可以用ES6提供的Proxy代理处理,代码如下:

var user = new Proxy({},{
   set:function(target,key,value,receiver){
       //处理代码
   }
})

如果使用这种方法,我觉得可以专门加一层collection的感觉,在一个对象中定义所有的属性,之后所有的新建都可以是new一个这个对象,并继承这个初始对象的所有属性,之后就基本只有修改的话可以只用defineProperty函数就可以了。

function extend(parent){
    var child={};
    for(var i in parent){
        child[i]=parent[i];
    }
    child.uber=parent;
    return child;
}

可以用这个extend方法来继承所有的属性。当然也可以用es6的class和extends来实现继承。

公司项目准备将ajax、backbone的fetch等进行整合,准备使用axios来统一的进行http请求,到时候一旦将backbone的fetch去掉,使用axois,可以自己尝试封装一下。当然,最简单的还是将json传入model层中自动转化为backbone的model,就能直接使用listenTo也不需要改太多代码了。

另外附一份代码,也是封装过的可以实现对象属性监听的代码。

//简单对象的属性的变化监控
//通过setAttr改变属性的值
  
var o = {
  'a':2,
  'b':3
};
function watch(obj, attr, callback){
   if(typeof obj.defaultValues == 'undefined'){
      obj.defaultValues = {};
      for(var p in obj){
        if(typeof obj[p] !== 'object') 
            obj.defaultValues[p] = obj[p];
      }
   }
   if(typeof obj.setAttr == 'undefined'){
      obj.setAttr = function(attr, value){  
              if(this[attr] != value){
                this.defaultValues[attr] = this[attr];
                this[attr] = value;
                return callback(this);
              }
              return this;             
       };
   } 
}
watch(o, 'a', function(obj){
  console.log(obj);
});
o.setAttr('a',4);

明天继续Webpack

相关文章

  • 2017-08-03读书笔记(js监听对象属性改变)

    今天本来想继续看Webpack,但是无奈公司上线到11点,没有多少时间,就先看一篇别的文章 js监听对象属性改变。...

  • 09-02:JS 监听对象属性的改变

    JS 监听对象属性的改变 我们假设这里有一个 user 对象, (1)在 ES5 中可以通过 Object.def...

  • vue 遇到的坑

    一、watch监听数据 1、监听普通的变量 1、vue.js里面直接用watch监听对象变量,如果对象变量的属性发...

  • KVO

    KVO 全程 Key-Value Observing,俗称键值监听,可以用于监听某个对象属性值的改变 当监听对象的...

  • KVO用法简介及原理

    KVO简介 KVO全称Key-Value Observing(键值监听),当前对象某个属性值发生改变时,监听该属性...

  • OC底层原理学习笔记(二)- KVO、KVC的本质

    一、KVO 1、KVO实现属性监听的原理KVO俗称“键值监听”,可以用于监听某个对象属性值的改变未使用KVO监听的...

  • RxSwift:KVO监听对象属性

    RxSwift 监听对象属性 PersonModel ReactiveCocoa 监听对象属性

  • javascript学习之路

    nodejs cheerio 可以使用jquery风格处理字符串 observe.js 可以监听对象属性,被监听的...

  • ReactiveCocoa小结

    1. 监听 KVO 1.1> 监听对象的属性变化 1.2> 监听Bool值改变 1.3> 监听方法 2.事件 2....

  • vue-watch

    普通监听 缺点: 不能深度监听(对象属性的改变),刷新或首次加载不能执行 高级监听 handle:watch 中需...

网友评论

      本文标题:2017-08-03读书笔记(js监听对象属性改变)

      本文链接:https://www.haomeiwen.com/subject/ngumlxtx.html