什么是Proxy
Proxy对象是es6中新增的内建对象。Proxy是一种代理,可以帮助我们完成很多事情,例如对数据的处理,对构造函数的处理,对数据的验证等。Proxy更像是一种拦截器,可以在我们访问对象之前添加一层拦截,过滤一些操作。
1 2 3 4 5
|
var p = new Proxy(target, handle);
|
基本操作
get(target, propKey, receiver):拦截对象属性的读取。
1 2 3 4 5 6
|
get(target, propKey, receiver)
|
1 2 3 4 5 6 7 8
| var obj = {name: 'Lucy'} var p = new Proxy(obj,{ get: function(target, propKey, proxy){ return propKey === 'name' ? 'Hello ' + target[propKey] : target[propKey] } })
p.name
|
如果一个属性是不可配置(configurable)且不可写(writable),则 Proxy 不能修改该属性。
set(obj, prop, value, receive)
1 2 3 4 5 6 7
|
set: function(target, key, value,receive)
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| var obj = {age : 18} var p = new Proxy(obj,{ set : function(target,key,value){ if(key === 'age'){ target[key] = Math.min(value,100); }else{ target[key] = value; } } }) p.age = 101; p.age obj.age
|
has(target, prop) :boolean
has 方法是针对 in
操作符的代理方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const handler1 = { has (target, key) { if (key[0] === '_') { return false; } return key in target; } };
const monster1 = { _secret: 'easily scared', eyeCount: 4 };
const proxy1 = new Proxy(monster1, handler1); console.log('eyeCount' in proxy1);
console.log('_secret' in proxy1);
console.log('_secret' in monster1);
|
apply(target, thisArg, argumentsList)
apply() 方法用于拦截函数的调用。
1 2 3 4 5 6 7
|
apply(target, thisArg, argumentsList)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function sum(a, b) { return a + b; }
const handler = { apply: function(target, thisArg, argumentsList) { console.log(`Calculate sum: ${argumentsList}`);
return target(argumentsList[0], argumentsList[1]) * 10; } };
var proxy1 = new Proxy(sum, handler);
console.log(sum(1, 2));
console.log(proxy1(1, 2));
|