proxy 与 Object.defineProperty 的比较

2 篇文章 0 订阅

proxy 与 Object.defineProperty 的比较

proxy的优势

一、可以监视到更多的对象操作(delete 操作 和 对象中的方法调用等)

defineProperty 只能监视属性的读写

const stu = {
    name : 'tianqin',
    gender : 'female',
    age: ' 8'
}
const proxyStu = new Proxy( stu ,{
    deleteProperty(target ,property){
        console.log('delete',property);
        delete target[property]  
    }
})
delete proxyStu.age 
console.log(stu)


/*  
这是输出后的内容 ,可以看到 age 属性已经被删掉了 

[nodemon] restarting due to changes...
[nodemon] starting `node .\proxy.js`
delete age
{ name: 'tianqin', gender: 'female' }
[nodemon] clean exit - waiting for changes before restart



*/

其他拓展操作方法:

handler方法触发方式
get读取某个属性
set写入某个属性
hasin操作符
deletePropertydelete操作符
getPropertyObject.getPropertypeOf( )
setPropertyObject.setPropertypeOf( )
isExtensibleObject.isExtensible( )
preventExtensionsObject.preventExtensions( )
getOwnPropertyDescriptorObject.getOwnPropertyDescriptor( )
definePropertyObject.defineProperty( )
ownKeysObject.keys( ) \ Object.getOwnPropertyNames( ) \ Object.getOwnPropertySymbols( )
apply调用一个函数
construct用new调用一个函数
二、proxy支持对数组对象的操作
const arr = []
const arrProxy = new Proxy(arr,{
    set(target , property ,value) {
        console.log('set',property, value)
        target[property] = value;
        return true;
    }
})
arrProxy.push(100);
arrProxy.push(100);
console.log(arr)

/*
输出结果:
set 0 100
set length 1
set 1 100
set length 2
[ 100, 100 ]

*/
三、不需要侵入对象

proxy 不会对原对象进行任何操作,就会对内部对象进行读写

const person ={}
const personProxy = new Proxy(person,{
    get(target ,property){
        return target[property]
    },
    set(target,property,value){
        target[property] = value
    }
})

反关defineProperty

const obj = {}
Object.defineProperty(obj , 'name',{
    get(){
        console.log('the name has been updated!')
        return obj.__name;
    },
    set(value){
        console.log('the name has been set')
        obj._name = value
    }
})
Object.defineProperty(obj , 'age',{
    get(){
        console.log('the age has been updated!')
        return obj._age;
    },
    set(value){
        console.log('the age has been set')
        obj._age = value
    }
})
obj.name = 'tianqin~';
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值