Proxy代理對象

Proxy 對象為ES6的新代理對象,及其類似于ES5中的Object.defineProperty的對象劫持,但是又區(qū)別于Object.defineProperty
在MDN中是這樣描述Proxy的

Proxy 對象用于定義基本操作的自定義行為(如屬性查找、賦值、枚舉、函數(shù)調(diào)用等)。

本文中出現(xiàn)的Reflect對象在本文中不會著重介紹,如果感興趣的童鞋可以移步小進進不將就ES6之Reflect介紹,建議瞅一眼,挺好用的一個對象
        // 數(shù)據(jù)對象
        let obj = {
            name: '張三',
            age: 28,
            sex: 'male',
            grade: '三年級',
            father: '張大炮'
        };
        // 實例 
        let proxy = new Proxy(obj, {
            /*
             * target === obj
             * key === key
             * value === value
             * receiver === proxy變量
             * */
            // 當(dāng)獲取proxy身上的數(shù)據(jù)時會觸發(fā) get 方法
            get(target, key, receiver) {
                // Reflect 在未來有可能會替代 Object 對象
                // Reflect.get方法會在映射對象身上找該屬性,當(dāng)數(shù)據(jù)源身上有該屬性時返回true,沒有則返回false
                let res = Reflect.get(target, key, receiver);
                if(!res) {
                    throw `get ${ key } error`;
                }
                console.log('獲取');
                return res;
            },
            set(target, key, value, receiver) {
                // Reflect.set方法會在映射對象身上找該屬性,并賦值,如果賦值成功或者在對象上增加屬性并賦值則返回true,賦值失敗則返回false(如:Object.defineProperty中把對象屬性設(shè)置writable:false時)
                let res = Reflect.set(target, key, value, receiver);
                if(!res) {
                    throw `set ${ key } error`;
                }
                console.log('設(shè)置');
                return res;
            },
            deleteProperty(target, key) {
                // Reflect.deleteProperty方法會在映射對象身上找該屬性,并刪除該屬性,刪除成功返回true,刪除失敗則返回false(如:Object.defineProperty中把對象屬性設(shè)置configurable:false時)
                let res = Reflect.deleteProperty(target, key);
                if(!res) {
                    throw `delete ${ key } error`;
                }
                console.log('刪除');
                return res;
            }
        });

        console.log(proxy.name);
        proxy.name = '李四';
        delete proxy.father
        proxy['lastName'] = 'Xu';
        console.log(proxy);
        console.log(obj);
console
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容