谷歌、QQ支持,360、搜狗不支持
使用proxy代理可以实现,对原先的类不进行处理,新建一个类,对此进行拦截处理,以实现低耦合
可以通过代理拦截的方法,将方法进行重写。
//--------------例1--------------
let obj = {
webName: '百度',
url: 'www.baidu.com'
} let p = new Proxy(obj,{
get: function(target,key){
return target[key]
}, set: function(target,key,value){
target[key] = value
}
}); p.webName = 'baidu';
console.log(p.webName);
//------------例2-------------
Proxy实际上重载(overload)了点运算符
var proxy = new Proxy(target,handler); class Register{ // 定义一个类
constructor(){
this.prefix = '';
this.name = '';
console.log('构造完成');
}
} let obj = new Register(); // 使用new方法新建一个类 let p = new Proxy(obj,{ // 定义一个代理,起到拦截作用 将使用new方法创建的类使用Proxy代理
get: function(target,key){
return target[key];
}, set: function(target,key,value){
if(key == 'id' && value == 15){
target['prefix'] = '此人是逃犯';
} target[key] = value; if(key == 'name'){
value = target[key] + ',' + target['prefix'];
} return Reflect.set(target,key,value); // 调用反射,当set全部结束,输出的时候会调动get方法
}
}); p.id = 1; // . 会自动调用get和set方法 p.name = '张三'; // 相当于 调用set console.log(p.name); p.id = 15; p.name = '李四'; console.log(p.name);
实例:
//-----------------------------------
Proxy对象方法列表:
方法 描述
handler.apply() 拦截Proxy实例作为函数调用的操作
handler.construct() 拦截Proxy实例作为构造函数调用的操作
handler.defineProperty() 拦截Object.defineProperty操作
handler.deleteProperty() 拦截delete删除属性操作
handler.enumerate() 此方法将被废弃,不建议使用
handler.get() 拦截属性的读取操作
handler.getOwnPropertyDescriptor() 拦截Object.getOwnPropertyDescriptor()操作
handler.getPrototypeOf() 拦截获取原型对象操作
handler.has() 拦截属性检索操作
handler.isExtensible() 拦截Object.isExtensible()操作
handler.ownKeys() 拦截Object.getOwnPropertyNames()操作
handler.preventExtensions() 拦截Object.preventExtensions()操作
handler.set() 拦截属性赋值操作
handler.setPrototypeOf() 拦截Object.setPrototypeOf()操作
Proxy.revocable() 创建一个可取消的Proxy实例