先看defineProperty代理数据的缺点
const data = {
name: 'SharkDog'
};
const { name } = data;
Object.defineProperty(data, 'name', {
get() {
console.log('监听到get name');
return name;
},
set(newValue) {
console.log('监听到set name');
this.data = newValue;
}
});
console.log(data.name);
data.name = 'Susu';
console.log(data.name);
Proxy
const data = {
name: 'Susu',
age: 18
};
const dataProxy = new Proxy(data, {
get(target, key) {
console.log(`Proxy代理的对象中${key}被访问了`);
return target[key];
},
set(target, key, newValue) {
console.log(`Proxy代理的对象中${key}被修改值为${newValue}了`);
return target[key] = newValue;
},
has(target, key) {
console.log(`Proxy代理的对象被${key} in了`);
return key in target;
},
deleteProperty(target, key) {
console.log(`Proxy代理的对象中${key}被删除了了`);
delete target[key];
},
});
console.log(dataProxy.name);
dataProxy.age = 22;
console.log(data);
console.log(dataProxy.age);
console.log('age' in dataProxy);
console.log('height' in dataProxy);
delete dataProxy.age;
console.log(data, dataProxy);
function foo() { };
const fooProxy = new Proxy(foo, {
apply(target, thisArg, argArray) {
console.log('调用了', target, thisArg, argArray);
return target.apply(thisArg, argArray);
},
construct(target, argArray, newTarget) {
console.log('被new调用了');
return new target(argArray)
}
});
fooProxy();
fooProxy``;
new fooProxy;
fooProxy.call({}, 1, 2, 3);
fooProxy.apply({}, [3, 2, 1]);
Reflect
const data = {
_name: "susu",
get name() {
return this._name;
},
set name(newValue) {
this._name = newValue
}
};
const dataProxy = new Proxy(data, {
get(target, key, receiver) {
console.log(receiver, receiver === dataProxy);
return Reflect.get(target, key, receiver);
},
set(target, key, newValue, receiver) {
const result = Reflect.set(target, key, newValue, receiver);
if (result) console.log(key, '写入成功');
else console.log('写入失败');
}
});
console.log(dataProxy.name);
dataProxy.name = 'SharkDog';
console.log(dataProxy.name);