Proxy

作者: klmhly | 来源:发表于2019-03-23 14:30 被阅读0次

类似于代理模式,相当于在目标对象前架设了一个拦截层,提供了一种对对象进行过滤改写的方法。

使用方法

(1)定义handler代理对象,该对象里面是一系列的过滤函数
(2)创建目标对象var proxy = new Proxy(target,handler),对target对象进行handler的过滤

handler对象里面常用的方法

get(target,key):读取
set(target,key,value)修改
has(target,key)判断对象是否有某个属性
apply(target,object,args)拦截函数的调用
construct(target,args)拦截new命令

一个读取属性的代理例子

当读取的属性不在该对象时,返回-1

handle = {
    get(target,key){
        if(key in target){
            return target[key]
        }
        else{
            return -1
        }
    }
}

obj={
    name:'jack'
}
var person = new Proxy(obj,handle)
console.log(person.name)   //jack
console.log(person.age)   //-1
一个封装私有属性的例子

默认以_开头的属性时私有属性

var people = {
    name:'jack',
    _age:18
}

handler = {
    get(target,key){
        if(key.startsWith('_')){
            console.log('私有属性不能访问')
            return false
        }
        else{
            return target[key]
        }
    },

    set(target,key,value){
        if(key.startsWith('_')){
            console.log('私有属性不能改写')
            return false
        }
        else{
            target[key] = value
            return target[key]
        }
    },

    has(target,key){
        if(key in target){
            if(key.startsWith('-')){
                console.log('私有变量不能看到')
                return false
            }
            else{
                return true
            }
        }
        else{
            return false
        }
    }
}

var proxy = new Proxy(people,handler)

console.log(proxy.name)
console.log(proxy._age)

相关文章

网友评论

    本文标题:Proxy

    本文链接:https://www.haomeiwen.com/subject/fnkdvqtx.html