Proxy - Javascript中的代理器

    Javascript中的代理器,很實用的Proxy

    Proxy 這個詞的原意是代理,用在這里表示由它來“代理”某些操作,可以譯為“代理器”

    let d=new Proxy(target,handle);

    Proxy 對象的所有用法,都是上面這種形式,不同的只是handler參數的寫法。
    其中,

    • new Proxy()表示生成一個Proxy實例,
    • target參數表示所要攔截的目標對象,
    • handler參數也是一個對象,用來定制攔截行為。

    Proxy 可以理解成,在目標對象之前架設一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機制,可以對外界的訪問進行過濾和改寫

    作為構造函數,Proxy接受兩個參數:

    • 第一個參數是所要代理的目標對象(上例是一個空對象),即如果沒有Proxy的介入,操作原來要訪問的就是這個對象;
    • 第二個參數是一個配置對象,對于每一個被代理的操作,需要提供一個對應的處理函數,該函數將攔截對應的操作。

    如果handler沒有設置任何攔截,那就等同于直接通向原對象。

    另外Proxy 實例也可以作為其他對象的原型對象。

    Proxy的攔截操作列表

    get操作
    get(target, propKey, receiver)攔截對象屬性的讀取,比如proxy.fooproxy[‘foo’]

    get方法用于攔截某個屬性的讀取操作,可以接受三個參數,依次為目標對象、屬性名proxy 實例本身(嚴格地說,是操作行為所針對的對象,也就是所謂的接收器),其中最后一個參數可選。

    get方法可以繼承。

    set操作

    set方法用來攔截某個屬性的賦值操作,可以接受四個參數,依次為

    • 目標對象
    • 屬性名
    • 屬性值
    • Proxy 實例本身

    其中最后一個參數可選。

    set操作一般用于對于要賦值的數進行過濾,加工或是權限設置

    <script src="https://unpkg.com/vue@next"></script>
    <script>
        //定義對象數據
        let a = {
            value: 1
        };
        let b = {
            value: 2
        };
    
        //定義處理器
        handleA = {
            //get是對象的屬性值返回的方法
            //get語法將對象屬性綁定到查詢該屬性時將被調用的函數。
            get(target, prop) {//對象a,value
                console.log(`${target[prop]}獲取A:${prop}的值`)
                return target[prop]
            },
            //set是屬性值修改的方法
            //當嘗試設置屬性時,set語法將對象屬性綁定到要調用的函數。
            set(target, key, value) {//對象a,value, 設置的值
                console.log(`設置A:${key}的值為${value}`)
            }
        }
        handleB = {
            get(target, prop) {
                console.log(`獲取B:${prop}的值`)
                return target[prop]
            },
            set(target, key, value) {
                console.log(`設置B:${key}的值為${value}`)
            }
        }
    
        let pa = new Proxy(a, handleA)
        let pb = new Proxy(b, handleB)
        let sum = pa.value + pb.value;//第一次執行
        console.log("第一次打印,sum的值是:", sum)
    
        pa.value = 3;
        console.log(`簡簡單單的測試:`, a.value)
        pb.value = 4;
        console.log("第二次打印,sum的值是:", sum)
    
    
        //打印對象
        console.log(JSON.stringify(a))
    </script>

    實例

    可以打開瀏覽器控制臺,觀察打印的數值

    參考文章

    默認分類

    var - CSS自定義變量

    2022-8-16 18:13:40

    php默認分類

    開發微信小程序的URL Scheme - 前后端實戰項目

    2022-9-11 11:56:54

    ??
    Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
    無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
    0 條回復 A文章作者 M管理員
      暫無討論,說說你的看法吧
    ?
    個人中心
    購物車
    優惠劵
    今日簽到
    有新私信 私信列表
    搜索
    主站蜘蛛池模板: 亚洲V无码一区二区三区四区观看| 国产成人无码精品一区在线观看 | 国产激情一区二区三区| 亲子乱av一区区三区40岁| 亚洲中文字幕乱码一区| 亚洲一区二区三区91| 国产成人无码精品一区不卡| 亚洲第一区精品观看| 国产在线视频一区| 成人国内精品久久久久一区| 无码人妻AV免费一区二区三区| 无码人妻久久一区二区三区免费| 精品国产一区二区三区久久久狼| 国内精自品线一区91| 精品视频一区二区三区在线观看| 蜜臀AV无码一区二区三区| 国产一区二区三区在线影院| 国产精品美女一区二区三区 | 日韩精品乱码AV一区二区| 日韩一区二区三区射精| 精品人体无码一区二区三区| 国产精品 视频一区 二区三区| 在线视频一区二区三区| 久久青草国产精品一区| 精品视频一区二区观看| 亚洲国产精品一区第二页| 国产乱子伦一区二区三区| 无码成人一区二区| 国产福利一区二区三区视频在线| 一区二区在线视频观看| 一区二区免费国产在线观看| 麻豆天美国产一区在线播放| 国产亚洲一区区二区在线 | 亚洲AV日韩综合一区| 波多野结衣一区二区三区高清av | 亚洲欧美国产国产一区二区三区| 久久国产精品一区免费下载| 风间由美性色一区二区三区 | 日韩精品无码Av一区二区| 亚洲国产av一区二区三区丶| 国产色综合一区二区三区|