监听对象的方式
监听对象的操作
- Object.defineProperty( obj,key, { get(){}, set(){}} )
/* 监听对象的所有属性 */ let obj = { name: 'nano', age: 18 } Object.keys.forEach( item => { let value = obj[ item ] Object.defineProperty( obj, item, { get( ){ }, set( newV ){ value = newV } } ) } )
- Proxy类监听
Proxy类
- 定义: 如果需要监听一个对象,就对这个对象生成一个代理对象,通过这个代理对象的捕获器去捕捉这个代理对象的值的获取和改变,改变和获取值的操作通过代理对象会直接映射到原对象
- 使用结构: new Proxy(代理对象, 捕获器[13种])
const obj = { name: 'nano', age:18 } const objProxy = new Proxy(obj,{ get(target,key,receiver){ console.log('watch') return target[key] }, set(target,key,value,receiver){ console.log('change') target[key] = value } }) objProxy.name = 'roily' console.log(objProxy.age)
- get/set捕获器的参数解析
(1) target: 代理的目标对象
(2) key: 获取和发生变动的键值
(3) value: 需要设置的新值 [set捕获器]
(4) receiver: 调用的代理对象
Proxy的捕获器(常用)
has( target,key )
(1) 定义: 判断某个key值是否在代理对象上
(2) 注意: 只能拦截 in 关键字的判断,无法拦截hasOwnProperty()的判断const obj = { name:'nano' } const objProxy = new Proxy(obj,{ has(target,key){ console.log('监听操作') return key in target } }) 'name' in objProxy --> '监听操作' objProxy.hasOwnProperty('name') --> 不会触发
deleteProperty( target,key )
(1) 定义: 删除捕获器,捕获delete操作符删除的内容const obj = { name: 'nano' } const objProxy = new Proxy(obj,{ deleteProperty(target,key){ console.log( '监听delete操作' ) return delete target.key } }) delete objProxy.name --> '监听delete操作' console.log(obj) --> {}
Proxy的捕获器(补充)
getPrototypeOf( )
定义: 监听调用Object.getPropertyOf( )获取原型时的操作setPrototypeOf( )
定义: 监听调用Object.setPropertyOf( )设置原型时的操作isExtensible( )
定义: 判断一个对象是否可扩展时的捕捉preventExtensible( )
定义: 监听调用Object.preventExtensions( )时的操作getOwnPropertyDescriptor( )
定义: 监听调用Object.getOwnPropertyDescriptor( )时的操作defineProperty( )
定义: 监听调用Object.defineProperty( )时的操作ownKeys( )
定义: 监听调用Object.getOwnPropertyNames( )或Object.getOwnPropertySymbols( )时的操作apply( target,this,argArray )
(1)定义: 监听函数调用的操作functin add(){} let proxyAdd = new Proxy( add,{ apply( target,_this,applyArg ){ return target.apply(_this,applyArg) } } ) proxyAdd.apply({},[1,2])
注意: 用于函数对象
construct(target,argArray,newTarget )
(1)定义: 监听new操作符functin add(){} let ProxyAdd = new Proxy( add,{ construct( target,argArray,newTarget ){ return new target(...argArray) } } ) new ProxyAdd( )
注意: 用于函数对象
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!