对象代理基础学习

92 阅读1分钟

封装一段数据,但是一些属性只想要内部api调用,外部不可以调用,以此来保护数据。

es3 通过闭包实现

var person = function () {
    var people = {
        name:'rain',
        worker:'coder',
    };
    this.get = function (key) {
        return people[key];
    };
    this.set = function (key,val){
        people[key] = val;
    };
}
var man = new people();
console.log(man.get('name'))  // rain


es5 官方案例  Object.defineProperty

var obj = {};
var description = Object.create(null);
description.value = 'static';
Object.defineProperty(obj,'key',description);
Object.defineProperty(obj,'key',{
    enumerable:false,
    configurable:false,
    writable:false,
    value:'static'
})


对象中仍然是原始值。

es6    

var six = {
    name:"我是six",
    worker:"我是程序员",
}
var seven = new Proxy (six,{
    get (target,key){
        return target[key]
    },
    set (target,key,val){
        target[key] = val;
    },
});
console.log(seven.name);  // 我是six
seven.name = '新的名字';
console.log(seven.name); // 新的名字


Proxy  对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)

new Proxy(target, handler)

target

Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)

handler
一个对象,其属性是当执行一个操作时定义代理的行为的函数。