0%

Proxy和Reflect

proxy

一个Proxy对象包装另一个对象并拦截诸如读取、写入属性和其他操作,可以选择自行操作它们,或这允许proxy对象透明地处理它们

带有”get“捕捉器的默认值

get(target, property, receiver)

target:目标对象;

property: 目标属性名

receiver: 如果目标属性是一个 getter 访问器属性,则 receiver 就是本次读取属性所在的 this 对象。通常,这就是 proxy 对象本身(或者,如果我们从 proxy 继承,则是从该 proxy 继承的对象)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let numbers = [0, 1, 2];

numbers = new Proxy(numbers, {
get(target, prop) {
if (prop in target) {
return target[prop];
} else {
return 0; // 默认值
}
}
});

alert( numbers[1] ); // 1
alert( numbers[123] ); // 0(没有这个数组项)

使用”set”捕捉器进行验证

1
2
3
4
5
6
set(target, property, value, receiver):

target —— 是目标对象,该对象被作为第一个参数传递给 new Proxy,
property —— 目标属性名称,
value —— 目标属性的值,
receiver —— 与 get 捕捉器类似,仅与 setter 访问器属性相关。
1
2
3
4
5
6
7
8
9
10
11
12
13
let numbers=[];
numbers= new Proxy(numbers,{
set(target, prop, val){
if(typeof val=='number'){
target[prop]=val;
return true;//这里要返回true
}else{
return false;
}
}
});
numbers.push(1);
console.log(numbers);//[1],添加其他的会报错