您的位置:首页 > Web前端 > JavaScript

javascript 监听对象属性的变化

2016-12-01 11:16 585 查看
  许多优秀的MVVM框架都实现了数据的双向绑定。Vue.js采用监听-回调的方式来实现一向功能。监听回调的一般写法是这样的:

  

obj.watch(pro,function(new_value,old_value,_this){ });
那么如何实现watch函数呢?Vue的实现是通过Object.defineProperty()这个函数来实现,通过定义set和get属性的,来达到改变对象的值时调用用回调函数的目的。首先我们来看一下关于Object.defineProperty()这个函数的用法

var temperature = undefined;
Object.defineProperty(obj, 'temperature', {
get: function() {
return temperature;
},
set: function(value) {
temperature = value;
}
});


于是,当我们执行 obj.temperature =XX时,set函数就会自动调用,这为我们执行回调函数提供了契机。

所以完整的代码实现代码如下:

var obj = {
watch:function(pro,callback){
if(pro in this){
var old = this[pro];
Object.defineProperty(this,pro,{
set:function(val){
var o = old;
old = val;
callback(val,o,this);
},
get:function(){
return old;
}
});
} else {
throw new Error("no such property");
}
},
toString:function(){
var str = "{   ";
for(pro in this){
if(typeof this[pro] !== "function" )
str += (pro + " : " + obj[pro] + ",")
}
str[str.length-1] = ' ';
str += " }";
return str;
}
}
obj.a = 3;
obj.watch("a",function(n,o,_this){
console.log("new val = " + n
+"old val = " + o + " this is : " + (_this ));});
obj.a = 4;
以下是运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息