Proxy
的基本概念Proxy
是一个构造函数,它接受两个参数:
语法:
const proxy = new Proxy(target, handler);
Proxy
的常见用途可以使用 get
捕获器来拦截属性访问。
示例:
const target = {
message1: "hello",
message2: "world"
};
const handler = {
get: function(target, prop, receiver) {
if (prop === "message2") {
return "Proxy says: world";
}
return Reflect.get(target, prop, receiver);
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.message1); // 输出: hello
console.log(proxy.message2); // 输出: Proxy says: world
可以使用 set
捕获器来拦截属性赋值,并进行验证或修改。
示例:
const validator = {
set: function(obj, prop, value) {
if (prop === 'age') {
if (typeof value !== 'number' || value <= 0) {
throw new Error('The age must be a positive number');
}
}
obj[prop] = value;
return true;
}
};
const person = new Proxy({}, validator);
person.age = 25;
console.log(person.age); // 输出: 25
// person.age = -5; // 抛出错误: The age must be a positive number
可以使用 Proxy
实现数据绑定和观察者模式,以便在数据变化时触发相应的回调。
示例:
const observer = (obj, callback) => {
return new Proxy(obj, {
set(target, prop, value) {
target[prop] = value;
callback(prop, value);
return true;
}
});
};
const person = observer({ name: 'Alice', age: 25 }, (prop, value) => {
console.log(`Property ${prop} changed to ${value}`);
});
person.name = 'Bob'; // 输出: Property name changed to Bob
person.age = 30; // 输出: Property age changed to 30
可以使用 Proxy
阻止对对象的某些操作,例如防止属性被删除。
示例:
const immutabilityHandler = {
deleteProperty(target, prop) {
throw new Error(`Property ${prop} cannot be deleted`);
}
};
const immutableObject = new Proxy({ name: 'Alice', age: 25 }, immutabilityHandler);
// delete immutableObject.name; // 抛出错误: Property name cannot be deleted
Proxy
捕获器(Traps)以下是 Proxy
可以拦截的常见操作及相应的捕获器:
get(target, prop, receiver)
: 拦截对象属性的读取操作。set(target, prop, value, receiver)
: 拦截对象属性的赋值操作。has(target, prop)
: 拦截 in
操作符。deleteProperty(target, prop)
: 拦截 delete
操作符。ownKeys(target)
: 拦截对象属性名的读取操作。apply(target, thisArg, args)
: 拦截函数调用操作。construct(target, args, newTarget)
: 拦截 new
操作符。Proxy
对象是一个强大的工具,允许开发者自定义对象的行为,通过拦截和定义基本操作,可以实现许多高级功能,如属性访问控制、数据验证、数据绑定和观察者模式等。理解和灵活使用 Proxy
,可以使 JavaScript 编程更加灵活和高效。