Proxy

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

使用方法

(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 概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(met...
    pauljun阅读 3,258评论 0 1
  • 来自深入理解ES6第十二章,由于最近业务中经常用到,记录一下 这里内容都太学术了,有一篇简单介绍Proxy作用的文...
    NowhereToRun阅读 1,045评论 0 1
  • Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,...
    Masami_9e88阅读 363评论 0 1
  • Proxy代理是一个共通的概念,可以起到拦截的作用。ES6里将Proxy标准化了,提供了Proxy构造函数,用来生...
    张歆琳阅读 10,185评论 1 7
  • 风中飘荡的芦苇花 小时候 喜欢坐在草地上看蔚蓝的天空 那么洁净那么透明那么的美 长大后 喜欢在孤独的夜里看繁星点点...
    孙子曰阅读 1,085评论 13 18