deleteProperty
删除属性 delete
关键词
var o={a:1,b:2,c:3};
Object.defineProperties(o,{
d:{
configurable:true,
value:3
}
})
var p=new Proxy(o,{
deleteProperty(target,key){
var disc=Object.getOwnPropertyDescriptor(target,key);
if(!disc.enumerable){
return false;
}
return delete target[key];
// return Reflect.deleteProperty(target,key)
}
})
delete p.a;
delete p.d;
var o={a:1,b:2,length:3};
var p=new Proxy(o,{
deleteProperty(target,key){
if(key==="length"){
return false;
}
return Reflect.deleteProperty(...arguments);
}
})
delete p.a;
delete p.length;
console.log(o)
这个代理不能删除添加和修改数据内容
var o={a:1,b:2};
var p=new Proxy(o,{
set(target,key,value){
return false;
},
defineProperty(target,key,disc){
return false;
},
deleteProperty(target,key){
return false;
}
})
p.c=10;
p.d=1;
delete p.a;
console.log(o)
getOwnPropertyDescriptor
获取描述对象代理
var o={a:1,b:2};
Object.defineProperty(o,"c",{
value:3
})
var p=new Proxy(o,{
getOwnPropertyDescriptor(target,key){
var targetDisc=Reflect.getOwnPropertyDescriptor(...arguments);
var disc={
configurable:true,
writable:targetDisc.writable,
enumerable:targetDisc.enumerable,
value:10
}
return targetDisc;
}
})
var disc=Object.getOwnPropertyDescriptor(p,"c");
console.log(disc)
setPrototypeOf getPrototypeOf
设置和获取原型链代理对象
var p=new Proxy(o1,{
setPrototypeOf(target,proto){
console.log("aa")
proto.c=0;
return Reflect.setPrototypeOf(target,proto);
},
getPrototypeOf(target){
console.log("bb")
return Reflect.getPrototypeOf(target);
}
})
Object.setPrototypeOf(p,o);
console.log(o1);
var o2={e:10};
Object.setPrototypeOf(p,o2);
console.log(o1);
console.log(Object.getPrototypeOf(p));
console.log(p.__proto__)
p.__proto__={e:10}
has
返回自身的对象属性代理
var o={a:1,b:2,c:3};
var o1={d:10,e:20};
Object.setPrototypeOf(o,o1);
var p=new Proxy(o,{
has(target,key){
// return Reflect.has(target,key)
// return key in target;//会把所有对象属性和原型属性可枚举的都返回
console.log("aa")
return Object.hasOwn(target,key);//只返回自身的对象属性
}
})
console.log(Object.hasOwn(p,"a"));
调用代理的has使用in
console.log("a" in p);
console.log("d" in p)
for(var key in o){
console.log(key)
}
for(var key in p){
console.log(key)
}
preventExtensions isExtensible
可扩展代理
var o={a:1,b:2};
var p=new Proxy(o,{
preventExtensions(target){
if(target.a){
target.c=10;
}
// return Object.preventExtensions(target);
return Reflect.preventExtensions(target);
},
isExtensible(target){
console.log("bb");
Object.preventExtensions(target);
return Reflect.isExtensible(target);
}
})
Object.preventExtensions(p);
o.d=10;
console.log(o)
console.log(Object.isExtensible(p));
ownKeys
获取keys
var o={a:1,b:2,c:3,_d:4};
var p=new Proxy(o,{
ownKeys(target){
console.log("aaa");
var arr=Reflect.ownKeys(target);
return arr.filter(item=>!/^_/.test(item));
}
})
在使用Object.getOwnPropertyNames和Object.getOwnPropertySymbols都会触发ownKeys
Reflect.ownKeys(p) 也会调用owenKeys
var names=Object.getOwnPropertyNames(p);
var names1=Object.getOwnPropertySymbols(p);
var names =Reflect.ownKeys(p)
console.log(names)
apply
设置this指向
function fn(a,b){
console.log(this);
}
var o={a:1}
var p=new Proxy(fn,{
// target 是fn
// thisArg 是fn函数中this的指向
// argArr 就是fn函数执行带入的实参
apply(target,thisArg,argArr){
// console.log("aa",thisArg,argArr)
if(argArr.length===0) argArr=[1,2];
if(thisArg===undefined) thisArg=o;
return target.apply(thisArg,argArr);
}
});
p(1,2);
p.apply({a:1},[1,2]);
p.call({a:1},1,2);
p.bind({a:1})(1,2);
p();