首页 > web前端 > js教程 > es6中代理的详细介绍(代码示例)

es6中代理的详细介绍(代码示例)

不言
发布: 2018-11-17 16:17:16
转载
1889 人浏览过

本篇文章给大家带来的内容是关于es6中代理的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

概述

代理嘛,就是请代理人代替自己做某件事,但是和自己不一样的是代理人可以有自己的行为,甚至可以做出和预期相违背的行为。

栗子

声明一个普通对象origin,他有一个属性name

let origin={
    name: 'origin'
}
登录后复制

声明一个代理对象

let proxy=new Proxy(origin, {
    get: (target, key)=>target[key]+" from proxy",
    set: (target, key, value)=>target[key]="set by proxy "+value
})
登录后复制

此时输出originproxy,可以发现,proxy拥有和origin一样的name属性

console.log(origin) // {name: 'origin'}
console.log(proxy) // Proxy {name: 'origin'}
登录后复制

origin添加age属性,再输出,可以发现,originproxy都拥有了age属性

origin.age=1 
console.log(origin) // {name: 'origin', age: '1'}
console.log(proxy) // Proxy {name: 'origin', age '1'}
登录后复制

那就是代理吗,当然不是,我们尝试为proxy添加属性

proxy.x=1
console.log(origin) // {name: 'origin', age: '1', x:'set by proxy 1'}
console.log(proxy) // Proxy {name: 'origin', age '1'}
登录后复制

可以发现,虽然originproxy都拥有了x属性,但是并不是我们赋值的1,而是多了set by proxy 几个字符串,很明显,这里是执行了初始化proxy时传入的第二个对象的set方法
那如果我们get

console.log(proxy.x) // set by proxy 1
console.log(proxy.x) // set by proxy 1 from proxy
登录后复制

现在很清楚了,proxy就是origin的代理,所有在proxy上的操作都会同步到origin上,而对origin的操作却不会同步到proxy上,而且proxy还有自己的行为。

可以这么想,proxy就是origin的秘书,所有的事务处理都要提交给秘书,秘书有自己的办事准则,可以直接提交给老板,也可以拒绝提交,或者添加一些其他的行为再提交。那这个秘书到底能代理老板做哪些事呢?

陷阱

语法

let p = new Proxy(target, handler);
登录后复制

初始化一个代理需要有两个参数

target:代理目标

handle:陷阱,是一个对象,我们的操作就像一只逃跑的动物,如果猎人在所有可以逃跑的路上全部放满了陷阱,那我们总是会落入一起一个的。本质就是一个对象,键描述我们的操作,值是函数,描述我们的行为,一共有13种陷阱。

0x003 set:设置属性

语法:

set(target, key, value)
登录后复制

target: 代理对象

key: 设置的属性

value: 设置的属性值

栗子:

let origin={}
let proxy=new Proxy(origin,{
    set:(target, key, value)=>{
        if(value>5)target[key]=value+10000
    }
})
proxy.x=1
proxy.y=10
console.log(proxy) // Proxy {y: 10010}
console.log(origin) // {y: 10010}
登录后复制

说明:
上面我们放置了一个set陷阱,当我们做set操作的时候,就会被捕捉到,我们判断value是否大于5,如果不大于5我们就不会做任何东西,但是如果大于5,就会给做赋值操作,并且还将他加上了10000。上面的栗子就相当于一个拦截器了。

 get:访问属性

语法:

get(target, key)
登录后复制

target: 代理对象

key: 访问的属性

栗子:

let origin={
    x:1,
    y:2
}
let proxy=new Proxy(origin,{
    get:(target, key)=>{
        if(key==='x')return 'no'
        return target[key]
    }
})
console.log(proxy.x) // 'no'
console.log(proxy.y) // 2
登录后复制

 deleteProperty:删除属性

语法:

deleteProperty(target, key)
登录后复制

target: 代理对象

key: 要删除的属性

栗子:

let origin={
    x:1,
    y:2
}
let proxy=new Proxy(origin,{
    deleteProperty:(target, key)=>{
        if(key==='x')return
        delete target[key]
    }
})
delete proxy.x
delete proxy.y
console.log(proxy) // {x:1}
登录后复制

has:判断是否包含某属性

语法:

has(target, key)
登录后复制

target: 代理对象

key: 要判断的属性

栗子:

let origin={
    x:1,
    y:2
}
let proxy=new Proxy(origin,{
    has:(target, key)=>{
        if(key==='x')return false
        return true
    }
})
console.log('x' in proxy) // false
console.log('y' in proxy) // true
登录后复制

 ownKeys:获取自身属性值

  • 语法:

    ownKeys(target)
    登录后复制
    • target: 代理对象

  • 栗子:

    let origin={
        x:1,
        y:2
    }
    let proxy=new Proxy(origin,{
        ownKeys:(target)=>{
            return ['y']
        }
    })
    console.log(Object.getOwnPropertyNames(proxy)) // ['y']
    登录后复制

getPrototypeOf:获取prototype

  • 语法:

    getPrototypeOf(target)
    登录后复制
    • target: 代理对象

  • 栗子

    let origin={
        x:1,
        y:2
    }
    let proxy=new Proxy(origin,{
        getPrototypeOf:(target)=>{
            return null
        }
    })
    console.log(Object.getPrototypeOf(p)) // null
    登录后复制

setPrototypeOf:设置prototype

  • 语法:

    setPrototypeOf(target, prototype)
    登录后复制
    • target: 代理对象

    • prototype: 要设置的prototype

  • 栗子

    let origin={
        x:1,
        y:2
    }
    let proxy=new Proxy(origin,{
        setPrototypeOf:(target, prototype)=>{
            throw 'no'
        }
    })
    Object.setPrototypeOf(proxy, {}) //  Uncaught no
    登录后复制

defineProperty :设置属性描述

  • 语法:

    defineProperty(target, prop, descriptor)
    登录后复制
    • target: 代理对象

    • prop: 要设置描述的属性

    • descriptor: 描述

  • 栗子

    let origin={}
    let proxy=new Proxy(origin,{
        defineProperty:(target, prop, descriptor)=>{
            throw 'no'
        }
    })
    Object.defineProperty(proxy, 'x', {configurable: true}) //  Uncaught no
    登录后复制

getOwnPropertyDescriptor :获取自身属性描述

  • 语法:

    getOwnPropertyDescriptor(target, prop)
    登录后复制
    • target: 代理对象

    • prop: 获取描述的属性

  • 栗子

    let origin={}
    let proxy=new Proxy(origin,{
        getOwnPropertyDescriptor:(target, prop)=>{
            throw 'no'
        }
    })
    Object.getOwnPropertyDescriptor(proxy, 'x') //  Uncaught no
    登录后复制

isExtensible:判断是否可扩展

  • 语法:

    isExtensible(target)
    登录后复制
    • target: 代理对象

  • 栗子

    let origin={}
    let proxy=new Proxy(origin,{
        isExtensible:(target)=>{
           return false
        }
    })
    console.log(Object.isExtensible(proxy)); // false
    登录后复制

preventExtensions :阻止扩展

  • 语法:

    preventExtensions(target)
    登录后复制
    • target: 代理对象

  • 栗子:

    let origin={}
    let proxy=new Proxy(origin,{
        preventExtensions:(target)=>{
            return false;
        }
    })
    console.log(Object.preventExtensions(proxy)); // Uncaught TypeError: 'preventExtensions' on proxy: trap returned falsish
    登录后复制

construct:构造

  • 语法:

    construct(target, argumentsList, newTarget)
    登录后复制
    • target: 代理对象

    • argumentsList: 参数列表

    • newTarget: 新对象

  • 栗子:

    let Origin=function(){}
    let OriginProxy=new Proxy(Origin,{
      construct: function(target, argumentsList, newTarget) {
          throw 'error'  
      }
    })
    new OriginProxy() // Uncaught error
    登录后复制

apply:调用

  • 语法:

    apply(target, thisArg, argumentsList)
    登录后复制

    target: 代理对象

    thisArg: 上下文

    argumentsList: 参数列表

  • 栗子:

    let origin=function(){}
    let proxy=new Proxy(origin,{
      apply: function(target, thisArg, argumentsList) {
        throw 'error'
      }
    })
    origin() // Uncaught error
    登录后复制



以上是es6中代理的详细介绍(代码示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:segmentfault.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板