Object.defineProperty
缺陷:
1. 设计的初衷不是为了监听一个对象中的所有属性,初衷是定义普通的属性
2. 无法对新增属性、删除属性进行监听
Proxy 代理对象
const obj = {
name:'hyf',
age:18,
height:1.88
}
const p = new Proxy(obj,{
set:function(target,key,newValue){
target[key] = newValue
},
get: function(target,key){
return target[key]
},
has:function(target,key){
return key in target
},
deleteProperty: function(target,key){
delete target[key]
},
})
console.log(p.name)
p.name = 'myl'
console.log(p.name)
function Foo(){}
let fooProxy = new Proxy(Foo,{
apply(target,thisArg,otherArgs){
return target.apply(thisArg,otherArgs)
},
construct(target,argArray,newTarget){
return new target()
}
})
fooProxy.apply()
new fooProxy()
捕获器
get(target,key,)
:属性读取操作的捕获器
set(target,key,newValue,)
:属性读取操作的捕获器
has(target,key,)
: in 操作符的捕获器
deleteProperty(target,key,)
:delete操作符的捕获器
Reflect
操作JavaScript对象的方法,类似Object操作对象的方法。
为什么出现?
1. 早期没有考虑到对对象本身操作如何设计更加规范,全部放到Object上
2. Object是一个构造函数,放在Object上不合适
3. 类似in/delete,会让js开起来有些奇怪
4. 因此ES6新增Reflect对象,让这些操作集中到Reflect上
5. 在使用Proxy时,可以做到不操作原对象
常见方法
- Reflect.has(target,prop)
- Reflect.get(target,prop,[receiver])
- Reflect.set(target,prop,value,[receiver])
- Reflect.deleteProperty(target,prop)
const obj = {
name:'hyf',
age:18,
height:1.88
}
const p = new Proxy(obj,{
set:function(target,key,newValue,receiver){
let flag = Reflect.set(target,key,newValue,receiver)
if (!flag) {
throw new Error('修改失败')
}
},
get: function(target,key,receiver){
return Reflect.get(target,key,receiver)
},
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署