es6 proxy & reflect

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API 。 Proxy
可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy
是对应的。
let target = {
name:“Tom”,
age:“18”
};

let hander ={
get:function (target,key) {
console.log("get "+key);
return target[key];
},
set:function (target,key,value) {
console.log("set "+value);
target[key] = value;
}
};
let proxy = new Proxy(target,hander);
proxy.name;
console.log(proxy.name);
proxy.age = 25;
proxy.age;
console.log(proxy.age);
对于对象{}来说 object.[key] 为修改对象键值的参数 而 object.key = 参数 为添加一个键值
let targetEpt = {}
let proxyEpt = new Proxy(targetEpt, handler)
// 调用 get 方法,此时目标对象为空,没有 name 属性
proxyEpt.name // getting name
// 调用 set 方法,向目标对象中添加了 name 属性
proxyEpt.name = ‘Tom’
// setting name
// “Tom”
// 再次调用 get ,此时已经存在 name 属性
proxyEpt.name
// getting name
// “Tom”

// 通过构造函数新建实例时其实是对目标对象进行了浅拷贝,因此目标对象与代理对象会互相
// 影响
targetEpt)
// {name: “Tom”}

// handler 对象也可以为空,相当于不设置拦截操作,直接访问目标对象
let targetEmpty = {}
let proxyEmpty = new Proxy(targetEmpty,{})
proxyEmpty.name = “Tom”
targetEmpty) // {name: “Tom”}

get() 方法可以继承
let proxy = new Proxy({}, {
get(target, propKey, receiver) {
// 实现私有属性读取保护
if(propKey[0] === ‘_’){
throw new Erro(Invalid attempt to get private "${propKey}");
}
console.log('Getting ’ + propKey);
return target[propKey];
}
});

let obj = Object.create(proxy);
obj.name
// Getting name
私有变量保护 - 对调用的键值进行判断 :保护模式
//target 对象调用拦截
let tar ={
name:“tom”,
age:“18”
};
let va ={
get:function (tar,key) {
return tar[key];
},
set:function (tar,key,value) {
if(key==“name”){
throw new TypeError(“名字不可修改”);
}
else if(value>100){
throw new TypeError(“年龄不超过100”);
}else{
tar[key] =value;
}
}
};
let proxy = new Proxy(tar,va);
console.log(proxy.name);
// proxy.name = “jom”;
proxy.age = 100;
// proxy.age = 101;
console.log(proxy.age);

// let b = new ar();
// console.log(b.name);
// console.log(b.age);
//has 方法用于判断对象中是否存在键值
// let handler = {
// has: function(target, propKey){
// console.log(“handle has”);
// return propKey in target;
// }
// }
// let exam = {name: “Tom”}
// let proxy = new Proxy(exam, handler);
// console.log(“age” in proxy);

// //组合使用
// let exam = {
// name:“Tom”,
// age:24
// }
//
// let huder = {
// get:function (target,key) {
// return Reflect.get(target,key);
// },
// set:function (target,key,value) {
// Reflect.set(target,key,value);
// }
// }
// let proxy = new Proxy(exam,huder);
// proxy.name = “jom”;
// console.log(proxy.name);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_42975115

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值