let target = {};
let p = new Proxy(target, {});
p.a = 37; // 操作转发到目标
console.log(target.a); // 37. 操作已经被正确地转发
验证
通过代理,你可以轻松地验证向一个对象的传值。下面的代码借此展示了 set handler 的作用。
let validator = {
set: function(obj, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError('The age is not an integer');
}
if (value > 200) {
throw new RangeError('The age seems invalid');
}
}
// The default behavior to store the value
obj[prop] = value;
// 表示成功
return true;
}
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age); // 100
person.age = 'young'; // Uncaught TypeError: The age is not an integer
person.age = 300; // Uncaught RangeError: The age seems invalid
1. Proxy
Proxy
对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。2. 用法
无操作转发代理
在以下例子中,我们使用了一个原生 JavaScript 对象,代理会将所有应用到它的操作转发到这个对象上。
验证
通过代理,你可以轻松地验证向一个对象的传值。下面的代码借此展示了
set handler
的作用。扩展构造函数
方法代理可以轻松地通过一个新构造函数来扩展一个已有的构造函数。这个例子使用了
construct
和apply
。互换 DOM 节点的属性
有时,我们可能需要互换两个不同的元素的属性或类名。下面的代码以此为目标,展示了
set handler
的使用场景。值修正及附加属性
以下
products
代理会计算传值并根据需要转换为数组。这个代理对象同时支持一个叫做latestBrowser
的附加属性,这个属性可以同时作为 getter 和 setter。