Proxy和Reflect

1:监听对象的第一种方式 Object.defineProperty 

 1 const obj = {
 2     name: 'tyy',
 3     age: 20
 4 }
 5 Object.keys(obj).forEach((key) => {
 6     let value = obj[key]
 7     Object.defineProperty(obj, key, {
 8         get: function() {
 9             console.log(`监听到了获取${key}`);
10             return value
11         },
12         set: function(newvalue) {
13             console.log(`监听到了设置${key}`);
14             value = newvalue
15         }
16     })
17 })
18 console.log(obj.age);
19 obj.age = 18
20 console.log(obj.age);

这种方式虽然能监听,但是它的缺点不能新增属性或者删除属性

2:第二种监听对象的方式 一个类-----Proxy 使用方法 new一个Proxy(对象名字,{}) 相较于第一种方式的优点在于可以删除修改等 Proxy 中文名字也叫代理,可以避免操作原对象。

 1 const obj = {
 2         name: 'tyy',
 3         age: 20
 4     }
 5     //Proxy的基本使用
 6 const objProxy = new Proxy(obj, {
 7     get: function(target, key) {
 8         console.log(`监听了获取${key}`, target);
 9         return target[key]
10 
11     },
12     set: function(target, key, newvalue) {
13         console.log(`监听了设置${key}`, target);
14         target[key] = newvalue
15     },
16     //监听in
17     has: function(target, key) {
18         console.log(`监听了in ${key}`, target);
19         //返回key
20         return key in target
21     },
22     deleteProperty: function(target, key) {
23         console.log(`监听了delete ${key}`, target);
24         delete target[key]
25     }
26 })
27 console.log(objProxy.age);
28 objProxy.age = 18
29 console.log(objProxy.age);
30 console.log(obj.age);
31 //in的监听
32 console.log('age' in objProxy);
33 //delete的监听
34 delete objProxy.name
35 console.log(obj.name);

 

 传的target是对象,key是属性名

3:Peoxy的construct和apply----应用于函数对象

 1 function foo() {
 2     console.log('foo');
 3     return 'foo'
 4 }
 5 const fooProxy = new Proxy(foo, {
 6     apply: function(target, thisArg, otherarg) {
 7         console.log(`函数的apply侦听`);
 8         console.log(target, thisArg, otherarg);
 9         return target.apply(thisArg, otherarg)
10     },
11     construct: function(target, argArray, newTarget) {
12         console.log(`函数的construct侦听`, target, argArray, newTarget);
13         return new target()
14     }
15 })
16 fooProxy.apply({}, ['abc', 'bcd', 'cba'])
17 new fooProxy('aaa', 'bbb')

 

 4:Reflect 新增的一个对象,里面有很多操作javascript的方法,类似于Object的里面的一些方法,新增这个也是为了不让Object这个构造函数承担那么多,具体使用

 1 const obj = {
 2         name: 'tyy',
 3         age: 20
 4     }
 5     //Proxy的基本使用
 6 const objProxy = new Proxy(obj, {
 7     get: function(target, key) {
 8         console.log(`监听了获取${kRRey}`, target);
 9         return Reflect.get(target, key)
10 
11     },
12     set: function(target, key, newvalue) {
13         console.log(`监听了设置${key}`, target);
14         return Reflect.set(target, key, newvalue)
15     },
16     //监听in
17     has: function(target, key) {
18         console.log(`监听了in ${key}`, target);
19         //返回key
20         return Reflect.has(target, key)
21     },
22     deleteProperty: function(target, key) {
23         console.log(`监听了delete ${key}`, target);
24         return Reflect.deleteProperty(target, key)
25     }
26 })
27 console.log(objProxy.age);
28 objProxy.age = 18
29 console.log(objProxy.age);
30 console.log(obj.age);
31 //in的监听
32 console.log('age' in objProxy);
33 //delete的监听
34 delete objProxy.name
35 console.log(obj.name);

 

 

 注意Reflect可以把是否设置成果返回一个布尔值,例如上面result,相比之前可以监听到是否设置成功

 5:

 

posted @ 2022-03-29 21:02  沁霓  阅读(54)  评论(0)    收藏  举报