首頁 > web前端 > js教程 > 主體

es6中代理程式的詳細介紹(程式碼範例)

不言
發布: 2018-11-17 16:17:16
轉載
1869 人瀏覽過

這篇文章帶給大家的內容是關於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

      #: 代理物件

    Cyum
  • 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!