- 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;