- Proxy 用於修改某些操作的預設行為,在目標對象之前架設一層「攔截」,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機制,可對外界的訪問進行過濾和改寫。
get
屬性:該方法用於攔截某個屬性的讀取操作,可接受三個參數,依次為目標對象,屬性名和proxy
實例本身 (可選參數)- 如果訪問目標對象不存在的屬性,會拋出一個錯誤。如果沒有對這個攔截函數,訪問不存在的屬性,只會返回
undefined
- 如果訪問目標對象不存在的屬性,會拋出一個錯誤。如果沒有對這個攔截函數,訪問不存在的屬性,只會返回
set
屬性:該方法用於攔截某個屬性的賦值操作,可接受 4 個參數,依次為目標對象,屬性名,屬性值和proxy
實例本身 (可選參數)apply
屬性,該方法可接受三個參數,依次為目標對象,目標對象的上下文對象 (this) 和目標對象的參數數組has
屬性,該方法用來攔截 HasProperty 操作,即判斷對象是否具有某個屬性時,這個方法會生效,而且可接受兩個參數,依次為目標對象,需查詢的屬性名construct
屬性,該方法用於攔截new
命令,可接受兩個參數,依次為目標對象,構造函數的參數對象deleteProperty
屬性,該方法用於攔截 delete 操作,如果這個方法拋出錯誤或者返回 false,當前屬性就無法被 delete 命令刪除defineProperty
屬性,該方法攔截了 Object.defineProperty 操作getOwnPropertyDescriptor
屬性,該方法攔截 Object.getOwnPropertyDescriptor (),返回一個屬性描述對象或者 undefinedgetPrototypeOf
屬性,該方法主要用來攔截獲取對象原型,具體來說,攔截下面這些操作:Object.prototype.__proto__
Object.prototype.isPrototypeOf()
Object.getPrototypeOf()
Reflect.getPrototypeOf()
instanceof()
isExtensible
屬性, 該方法攔截 Object.isExtensible 操作ownKeys
屬性,該方法用來攔截對象自身屬性的讀取操作,具體來說,攔截下面這些操作:Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.keys()
for...in...
循環
preventExtensions
屬性,該方法攔截 Object.preventExtensions (),該方法必須返回一個布爾值,否則會被自動轉為布爾值setPrototypeOf
屬性,該方法主要用來攔截 Object.setPrototypeOf 方法Proxy.revocable
屬性,該方法返回一個可取消的 Proxy 實例
// get,set方法
let proxy = new Proxy({ },{
get: function(target, prop){
console.log('設置 get 操作');
return target[prop];
},
set: function(target, prop, value){
console.log('設置 set 操作');
target[prop] = value;
}
})
proxy.time = 35; // 設置 set 操作 35
console.log(proxy.time); // 設置 get 操作 35
// has 方法 隱藏某些屬性,不被in運算符發現
let handler = {
has: function(target, key){
if(key[0] === '_'){
return false;
}
return key in target;
}
}
let target = {
_prop: 'foo',
prop: 'foo'
}
let proxy = new Proxy(target, handler);
console.log('__prop' in proxy) //打印: false;
console.log('prop' in proxy) //打印: true;