一、proxy:1、代理 2、解决跨域问题
1.引入库
代码如下(示例):
var house = { size: '120平', price: 1400000, info: '位置好,大平层,落地窗' }
// new Proxy(target,handler)
// target: 要拦截的对象
// handler:要拦截对象的处理的行为。对象
var housePro = new Proxy(house, {
// target 目标对象
// property 获取的元素
// 获取 读操作
get(target, property) {
// console.log(target);
// console.log(property);
if (property == 'size') {
return '120平,公摊小,送地下室,送天台,送对象'
}
if (property == 'info') {
return '挨着学校,地铁,还有10几万平的大公园,还要一个大湖,南北通透,物业很好,上门服务,不要钱,国营企业有保证。'
}
return target[property]
},
// 设置 写操作
set(target, property, value) {
console.log(value);
target[property] = value
},
// ownKeys拦截操作,拦截过滤Object.Keys()对象的属性遍历
ownKeys() {
return ['size', 'info']
},
// has( )拦截操作:拦截key in object的操作,结果会返回一个布尔值。
has(target, property) {
// console.log(target);
// console.log(property);
if (target[property] == undefined) {
return false
}
return true
}
})
console.log(housePro.size);
console.log(housePro.info);
console.log(housePro.price);
housePro.price = 1500000
console.log(housePro.price);
console.log(Object.keys(housePro));
console.log('size' in housePro);
console.log('name' in housePro);
// apply方法 除了对象类型的变量可以被代理,函数也可以被代理。
let fn = function () {
console.log(123);
}
let pro = new Proxy(fn, {
apply() {
console.log(456);
}
})
pro()
/*
proxy.revocable方法
如果创建了代理之后又想取消代理的话,我们可以用Proxy.revocable( )(可废止的,可撤回的;)
函数来实现,它会返回一个对象,对象中含有一个proxy属性,它就是Proxy的代理实例对象;
还有一个revoke属性,它是一个方法,用于取消代理。
*/
let porAble = Proxy.revocable(house, {
get(target, property) {
return target[property]
}
})
console.log(porAble);
console.log(porAble.proxy.size);
porAble.revoke()
console.log(porAble.proxy.size);// 不能对已撤销的代理执行“get”操作