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:

浙公网安备 33010602011771号