Proxy:代理
作用:预警、上报、扩展功能、统计、增强对象等等
是设计模式的一种,代理模式
语法:
new Proxy(target,handler)
//target:被代理的对象
//handler:对代理的对象做什么操作
handler:{
set(){};//设置的时候干的事情
get(){};//获取的时候干的事情
deleteProperty(){};//删除
has(){};//有没有这个东西
apply(){};//调用函数处理
…
}
例1
let obj = {//此对象不给用户暴露
name : 'yang'
}
let newObj = new Proxy(obj,{//obj被代理
get(target,property){
return target[property];
}
})
console.log(newObj.name);//yang
例2:实现访问一个对象身上属性,默认不存在的时候返回undefined,希望如果不存在返回错误(警告)信息
let obj = {
name : 'yang'
}
let newObj = new Proxy(obj,{
get(target,property){
if(property in target){
return target[property];
}else{
throw new ReferenceError(`${property}不在此对象上`)
};
}
})
console.log(newObj.name);//yang
console.log(newObj.age);//ReferenceError: age不在此对象上
例3:实现以下功能
DOM.div():创建一个div
DOM.ul():创建一个ul
DOM.a():创建一个a
const DOM = new Proxy({},{
get(target,property){
return function(attr={},...children){
const el = document.createElement(property);
//添加属性
for(let key of Object.keys(attr)){
el.setAttribute(key,attr[key]);
}
//添加子元素
for(let child of children){
if(typeof child == 'string'){
child = document.createTextNode(child);
}
el.appendChild(child);
}
return el;
}
}
});
let oDiv = DOM.div({id:'div'},'div','呵呵呵')
window.onload = function(){
document.body.appendChild(oDiv);
}
Reflect :反射
可以通过Reflect对象身上直接拿到语言内部的东西
‘assign’ in Object可以写成 Reflect.has(Object,'assign);
delete json.a 可以写成 Reflect.deleteProperty(json,‘a’);
Reflect.apply(调用的函数,this指向,参数)
function sum(a,b){
return a + b;
}
let newSum = new Proxy(sum,{
//拦截方法
apply(target,context,argus){
return Reflect.apply(...arguments);
}
})
console.log(newSum(2,3));