ES6带了的Proxy代理机制,那什么是代理机制呢,这就和银行的业务模式是一样的,它代理着我们的金融账户,我们要查账存钱取钱直接去营业厅就可以办理,这节内容我们一起探究一下它的基本操作,比如说一些拦截操作:set、get、apply、has、ownKeys等,我们可以根据需求编写拦截程序,达到我们想要的效果;此外,还可以利用Proxy.revocable( )实现取消代理。另外还有一些例如:、defineProperty()、deleteProperty()、enumerate()、getOwnPropertyDescriptor()、getPrototypeOf()、isExtensible()、preventExtensions()、setPrototypeOf(),在此就不进行详细叙述,有兴趣的同学自行查阅资料。
get():代理中对属性进行拦截的操作,看代码:
//定义一个对象person
var person = {"name":"张三"};
//创建一个代理对象pro,代理person的读写操作
var pro = new Proxy(person,{
get:function(target,property){
return "李四"
}
});
pro.name;//李四
person本身的name值是“张三”,但经过代理后不管原值是多少,代理后返回的值都将会是“李四”,这就是代理做的拦截作用。
set():在设置时候进行拦截作用,我们以银行业务为例,看代码:
//定义一个对象,含有RMB和dollar属性值
var bankAccount = {"RMB":1000,"dollar":0};
//创建一个Proxy代理实例
var banker = new Proxy(bankAccount,{
//编写get处理程序
get:function(target, property){
//判断余额是否大于0
if(target[property] > 0){
//有余额,就返回余额值
return target[property];
}else{
//没钱了
return "余额不足";
}
},
//编写set处理程序
set:function(target,property,value){
//存入的数额必须是一个数字类型
if(!Number.isInteger(value)){
return "请设置正确的数值";
}
//修改属性的值
target[property] = value;
}
});
banker.RMB;
//结果:1000
banker.dollar;
//结果:余额不足
//修改dollar属性的值,值是字符串类型
banker.dollar = "五百";
banker.dollar;
//结果:余额不足
//修改dollar属性的值,值是数字类型
banker.dollar = 500;
banker.dollar;
//结果:500
ownKeys()方法:ownKeys拦截操作,拦截过滤Object.ownKeys()对对象的属性遍历。
//定义一个对象person,有三个属性
let person = {"name":"老王","age":40,"height":1.8};
//创建一个代理对象
let proxy = new Proxy(person,{
//ownKeys过滤对对象的属性遍历
ownKeys:function(target){
return ["name","age"]
}
});
Object.keys(person);
//结果:["name", "age","height"]
Object.keys(proxy);
//结果:["name", "age"]
原本有三个属性,经过过滤,外部只能访问两个属性,这就是ownKeys()方法:
has()方法:has( )拦截操作:拦截key in object的操作,结果会返回一个布尔值:
var person = {
"name":"张三",
"age":20
};
var proxy = new Proxy(person, {
has: function(target, prop) {
if(target[prop] === undefined){
return false;
}else{
return true;
}
}
});
"name" in proxy;//结果:true
"height" in proxy;//结果:false
这个可以拦截查询方法,在查询的时候,获取到是不是有这个值然后对返回值进行设定;
apply()方法:除了对象类型的变量可以被代理,函数也可以被代理。如果被代理的变量是一个函数,那么还会支持一个拦截程序:
//创建一个函数fn
let fn = function(){
alert('这是大佬');
};
//创建一个代理实例,代理函数fn
let proxy = new Proxy(fn,{
apply:function(){
alert('我是隔壁老王');
}
});
proxy();//结果:我是隔壁老王
Proxy.revocable():取消代理,如果创建了代理之后又想取消代理的话,我们可以用Proxy.revocable( )函数来实现,它会返回一个对象,对象中含有一个proxy属性,它就是Proxy的代理实例对象;还有一个revoke属性,它是一个方法,用于取消代理:
//定义一个对象
let person = {"name":"张三"};
//定义一个代理处理程序
let handle = {
get:function(target,prop){
return "李四";
}
};
//使用Proxy.revocable()进行代理
let object = Proxy.revocable(person,handle);
object.proxy.name;//结果:李四
//调用返回对象object的revoke方法,取消代理
object.revoke();
object.proxy.name;//报错,代理被取消
代理的主要目的就是对属性、方法之类的拦截,让方法获取的数据是进过处理后的,方便方法使用者直接使用。