ES6代理

1、proxy的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    let my = {
        location : "市区",
        housePrice : 20000
    }
 
//在我们获取数据前进行处理;//参数 第一要代理的对象 第二 处理函数
    let intermediaryAgent = new Proxy(my,{
 
        //get函数
        get(target,property){
            console.log(target);
            console.log(property);
            if(property == 'housePrice'){
                return target[property]*1.2;
            }else if (property == "location"){
                return "位于市中心";
            }
            return target[property];
        }
    })
 
    console.log(intermediaryAgent.location);

2、set方法   

参数 target当前对象 property 设置的那个属性 value 代表给属性赋的值是
作用,给属性值处理后设置值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
let account = {
    balance: 8000,
    money: 100
}
 
//第一我们要代理谁 //set 设置数据进行处理
let bank = new Proxy(account, {
    get(target, property) {
        return target[property];
    },
    //参数 target当前对象 property 设置的那个属性 value 代表给属性赋的值是
    set(target, property, value) {
        console.log(value);
        if (property === 'bankMoney') {
            if (target.balance > value) {//判断自己的钱是否大于 传入的 是取钱 否余额不足
                target.balance = target.balance - value
                console.log(target.balance);
            } else {
                console.log("余额不足")
            }
        }
    },
     
    ownKeys: function (target) {
        return balance;//截获 只给该代理一个参数,其他属性获取不到
    },
    has:function(target,property){//has()方法用于是判断是否含有指定的键值对,有,就返回true。否则返回false。
        if(target[property]===undefined){
            return false;
        }else {
            return true;
        }
    }
})
bank.bankMoney = 7000;
console.log(bank.balance)

  

3、ownKeys:截获 只给该代理相应属性,其他属性获取不到

1
2
3
ownKeys: function (target) {
    return balance;//截获 只给该代理一个参数,其他属性获取不到
},

  

4、has()方法用于是判断是否含有指定的键值对。有,就返回true。否则返回false。

1
2
3
4
5
6
has:function(target,property){//has()方法用于是判断是否含有指定的键值对,有,就返回true。否则返回false。
    if(target[property]==undefined){
        return false;
    }else {
        return true;
    }

  

5、apply方法 ,函数可以被代理。使用apply调用。

1
2
3
4
5
6
7
8
9
10
11
let fn = function(){
    console.log("被代理函数")
}
 
let fn1 = new Proxy(fn,{
    apply: function(){
        console.log("代理")
    }
})
 
fn1();//代理

  

6、Proxy.revocable方法

(可废止的,可撤回的;)函数来实现,它会返回一个对象,对象中含有一个proxy属性,它就是Proxy的代理实例对象;还有一个revoke属性,它是一个方法,用于取消代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let person = {"name":"张三"};
//处理程序
let handLe = {
    get : function(target,prop){
        return "李四";
    }
};
 
//使用Proxy.revocable()进行代理
let obj = Proxy.revocable(person,handLe);
 
console.log(obj.proxy.name);//李四
 
//revoke 取消代理
obj.revoke();
console.log(obj.proxy.name);//报错代理被取消

  

原文地址:https://www.cnblogs.com/wangxue13/p/13604554.html