proxy
用于代理对象、数组、函数。可以对其做一些特殊处理,把修改完的数据返回出去、
// 代理 对象
let obj = {a :1}
let nObj = new Proxy(obj,{
get(target,property){
return target[property]
},
set(target,property,value){
return target[property] = value
}
})
// 代理 数组
let arr = ['a','b','c']
let nArr = new Proxy(arr,{
get(target,property){
return target[property]
},
set(target,property,value){
return target[property] = value
}
})
console.log(nArr)
nArr[0] = 'd'
// 转为数组 => 不知道这种解题思路是否正确
let newArr = [...new Set(nArr.values())]
console.log(newArr)
常用方法
方法 | 描述 |
---|---|
handler.apply() | 拦截 Proxy 实例作为函数调用的操作 |
handler.construct() | 拦截 Proxy 实例作为函数调用的操作 |
handler.defineProperty() | 拦截 Object.defineProperty() 的操作 |
handler.deleteProperty() | 拦截 Proxy 实例删除属性操作 |
handler.get() | 拦截 读取属性的操作 |
handler.set() | 拦截 属性赋值的操作 |
handler.getOwnPropertyDescriptor() | 拦截 Object.getOwnPropertyDescriptor() 的操作 |
handler.getPrototypeOf() | 拦截 获取原型对象的操作 |
handler.has() | 拦截 属性检索操作 |
handler.isExtensible() | 拦截 Object.isExtensible()操作 |
handler.ownKeys() | 拦截 Object.getOwnPropertyDescriptor() 的操作 |
handler.preventExtension() | 拦截 Object().preventExtension() 操作 |
handler.setPrototypeOf() | 拦截Object.setPrototypeOf()操作 |
Proxy.revocable() | 创建一个可取消的 Proxy 实例 |
get
获取代理的值
let obj = {
name: '前端伪大叔'
}
// 第一个参数是需要代理的对象
// 第二个参数代理的方法
let newObj = new Proxy(obj,{
// 1、代理的对象 2、代理的对象的key
get(target,property){
if(property in target){
return target[property]
}else{
console.warn(`${property}不存在`)
}
}
})
console.log(newObj.name); // 前端伪大叔
console.log(newObj.Proxy);// Proxy不存在
set
修改代理的value值,可以在返回的地方返回boolean值。如果没有修改返回false
let newObj = new Proxy(obj, {
// 1、代理的对象 2、key值 3、修改的key
set(target, property, value) {
// 判断对象的value是否被修改
if (target[property] === value) {
return target[property]
} else {
return target[property] = value
}
}
})
console.log(newObj.name);
newObj.name = '1'
console.log(newObj.name);
has
针对
in
操作符做的代理,
let obj = {
name: '前端伪大叔',
age: 19
}
let newObj = new Proxy(obj, {
// 1、代理的对象 2、需要劫持的属性
has(target, prop) {
// 只有key是name的时候才返回true
if (prop === 'name') {
return true
} else {
return false
}
}
})
console.log('name' in newObj); // true
console.log('age' in newObj); // false
apply
拦截函数的调用
function fun (a,b) { return a + b}
let funs = new Proxy(fun,{
// 1、函数本身 2、被调用的上下文对象 3、传入的参数(array格式)
apply(target,thisArg,argumentsList){
return argumentsList[0] + argumentsList[1] * 2
}
})
console.log(funs(1,2));
deleteProperty
拦截删除的对象
let newObj = new Proxy(obj, {
// 1、传入对象 2、key
deleteProperty(target, property) {
// 只能删除对象 key值为a的
if(property === 'a'){
delete target[property]
}else{
alert('只能删除a')
}
}
})
delete newObj.a;
delete newObj.b;
console.log(newObj);