ES6知識點整理之Proxy的應(yīng)用實例詳解
本文實例講述了ES6知識點整理之Proxy的應(yīng)用。分享給大家供大家參考,具體如下:
Proxy 用于修改對象某些操作的默認(rèn)行為,可以對外界的訪問進(jìn)行過濾和改寫,其概念類似于元編程。
Proxy 讓我們可以對任何對象的絕大部分行為進(jìn)行監(jiān)聽和干涉,實現(xiàn)更多的自定義程序行為。在目標(biāo)對象之前架設(shè)一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截。
目前【兼容性】存在一定的問題,目前在chrome和ff瀏覽器中的非嚴(yán)格模式下可用,一些先進(jìn)的技術(shù)即使在目前不能廣泛應(yīng)用,但隨著時間的流逝,都將會進(jìn)入程序員日常的編程中。
注: 博客整理時間:2018-03-24 16:21:15
初識Proxy
var obj = {name:'Joh'};
var proxy = new Proxy(obj, {
get (target, key) {
return 'test1';
},
set (target, key, value) {
target[key] = value
}
});
console.log(proxy.name); // test1 進(jìn)行g(shù)et取值
proxy.name = 'test2'; // 進(jìn)行set設(shè)置
console.log(obj.name); // test2
通過Proxy對象進(jìn)行攔截target對象的屬性
完整的使用Proxy進(jìn)行設(shè)置, 獲取,修改和刪除的案例
var obj = {name:'Joh',group:'g1',_type:'student'};
var proxy = new Proxy(obj, {
get (target, key) {
if(key[0]!== '_') {
// return Reflect.get(target,key); // 效果等同于下面的return語句
return target[key];
};
},
set (target, key, value) {
if(key[0]!== '_') {
// Reflect.set(target,key,value);
return target[key] = value;
}
},
deleteProperty(target, key) {
// 業(yè)務(wù)邏輯
if(key[0] !== '_') {
// Reflect.deleteProperty(target, key);
delete target[key];
}
}
});
console.log(proxy.name); // Joh
console.log(obj.name); // Joh
proxy.name = 'Lily'; // 在非嚴(yán)格模式下的賦值操作,嚴(yán)格模式將會報錯
console.log(obj.name); // Lily
delete proxy.name; // 未能成功刪除,因為上面內(nèi)部有判斷
console.log(obj.name); // undefined 成功刪除
delete proxy.group;
console.log(obj.group); // undefined 成功刪除
delete proxy._type;
console.log(obj._type); // student
proxy.color='red';
console.log(obj.color); // red
其中借助Reflect實現(xiàn)和直接實現(xiàn)的效果等同
通過has方法和in關(guān)鍵字進(jìn)行攔截的示例:
var obj = {name:"Joh",_name:"Lily"};
var proxy = new Proxy(obj, {
has(target, key) {
if(key[0] === '_'){
return false;
} else {
return key in target;
}
}
});
console.log('has name attr: ', 'name' in proxy); // has name attr: true
console.log('has _name attr: ', '_name' in proxy); // has _name attr: false
使用ownKeys方法與for-in遍歷過濾符合特定規(guī)則屬性的示例
var obj = {name:"Joh",_name:"Lily", age:10, group:"g1"};
var proxy = new Proxy(obj, {
ownKeys (target) {
return Reflect.ownKeys(target).filter(key => key[0] !== '_');
}
});
for(var k in proxy) {
console.log(k); // 分別輸出 name age group 過濾了 _name
}
通過apply方法對函數(shù)調(diào)用的攔截
function test() {
console.log('hello world');
}
var proxyFun = new Proxy(test,{
apply(target,ctx,args) {
console.log('proxy apply');
return Reflect.apply(target,ctx,args);
}
});
proxyFun(); // 分別輸出 proxy apply 和 hello world
// proxyFun.apply(); // 同樣,分別輸出 proxy apply 和 hello world
// proxyFun.call(); // 同樣,分別輸出 proxy apply 和 hello world
通過construct方法對構(gòu)造函數(shù)實例化的攔截
function User() {
console.log('this is a contructor');
}
var ClassProxy = new Proxy(User, {
construct(target,args) {
console.log('proxy construct');
return Reflect.construct(target,args);
}
});
new ClassProxy(); // 分別輸出 proxy construct 和 this is a contructor
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
一文詳解JavaScript普通函數(shù)與箭頭函數(shù)的本質(zhì)區(qū)別與使用場景
作為前端開發(fā)者,我們每天都在和各種函數(shù)打交道,ES6引入的箭頭函數(shù)讓JavaScript的函數(shù)世界更加豐富多彩,但你真的了解它們之間的區(qū)別嗎?今天,我就來為大家詳細(xì)剖析普通函數(shù)與箭頭函數(shù)的那些事兒,感興趣的朋友跟著小編一起來看看吧2025-05-05
js簡單實現(xiàn)Select互換數(shù)據(jù)的方法
這篇文章主要介紹了js簡單實現(xiàn)Select互換數(shù)據(jù)的方法,涉及javascript動態(tài)操作select中option節(jié)點的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
Bootstrap標(biāo)簽頁(Tab)插件切換echarts不顯示問題的解決
這篇文章主要給大家介紹了關(guān)于Bootstrap標(biāo)簽頁(Tab)插件切換echarts不顯示問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
手機(jī)平板等移動端適配跳轉(zhuǎn)URL的js代碼
這篇文章主要為大家分享下手機(jī)平板等移動端適配跳轉(zhuǎn)URL的js代碼,需要的朋友可以參考下2014-01-01
JS實現(xiàn)HTML標(biāo)簽轉(zhuǎn)義及反轉(zhuǎn)義
本文主要介紹了JS實現(xiàn)HTML標(biāo)簽轉(zhuǎn)義及反轉(zhuǎn)義的方法。具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01
JavaScript動態(tài)提示輸入框輸入字?jǐn)?shù)的方法
這篇文章主要介紹了JavaScript動態(tài)提示輸入框輸入字?jǐn)?shù)的方法,實例分析了javascript針對頁面元素的動態(tài)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07

