20+行代码使用es5 Object.defineProperty 实现简单的watch功能

本文通过一个简单的示例展示了如何利用JavaScript中的Object.defineProperty方法来实现对对象属性变化的监听。这种方法常被用于前端框架中实现数据响应式,如Vue.js的数据绑定机制。通过get和set访问器属性,可以在属性值改变时触发回调函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 /**
 2  * 一个简单的demo 帮助理解defineProperty,只对Object类型参数有效
 3  */
 4 $watch=function(myObject,callback){
 5     function initWatch(obj){
 6         for(var i in obj){
 7             if(typeof obj!='object'){
 8                 return;
 9             }
10             (function(value,o,attr){
11                 var v=value;
12                 var oldValue=value;
13                 Object.defineProperty(o,attr,{
14                     get:function(){
15                         return v;
16                     },
17                     set:function (newValue){
18                         oldValue=v;
19                         v=newValue;
20                         callback(newValue,oldValue)
21                     }
22                 });
23             })(obj[i],obj,i);
24             initWatch(obj[i]);
25         }
26     }
27     initWatch(myObject);
28 };
29 var a={
30   name:'Lee',
31   background:{
32     hometown:'De Zhou',
33     presentAddr:'Texas'
34   }
35 }
36 $watch(a,function(newValue,oldValue){
37   console.log(a.name+" moved from "+ oldValue + " to " + newValue);
38 })
39 a.background.presentAddr="New York"
40 //Lee moved from Texas to New York
41 //"New York"

  Object.defineProperty()方法是实现vue双向绑定的重要api,关于该方法的详细信息可移步:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty。这里主要应用了其get/set函数的功能。对get/set方法而言,值得一提的是,当使用了get/set 方法后,原有的属性便已经被对应的get/set方法所替代。

  以上代码简单模拟了对一个object的watch功能,模拟ng或vue中的watch,对一个对象进行监听,其中任一属性发生了改变随即执行callback。

转载于:https://www.cnblogs.com/ideal-lx/p/7040582.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值