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