vue技术学习es6 语法学习

ES6基础教程(第九节)——Proxy代理机制

2019-07-03  本文已影响13人  多平方

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;//报错,代理被取消

代理的主要目的就是对属性、方法之类的拦截,让方法获取的数据是进过处理后的,方便方法使用者直接使用。

公众号
上一篇下一篇

猜你喜欢

热点阅读