handler.set()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
handler.set()
方法是设置属性值操作的捕获器。
尝试一下
const monster1 = { eyeCount: 4 };
const handler1 = {
set(obj, prop, value) {
if (prop === "eyeCount" && value % 2 !== 0) {
console.log("Monsters must have an even number of eyes");
} else {
return Reflect.set(...arguments);
}
},
};
const proxy1 = new Proxy(monster1, handler1);
proxy1.eyeCount = 1;
// Expected output: "Monsters must have an even number of eyes"
console.log(proxy1.eyeCount);
// Expected output: 4
proxy1.eyeCount = 2;
console.log(proxy1.eyeCount);
// Expected output: 2
语法
js
new Proxy(target, {
set(target, property, value, receiver) {
}
});
参数
以下是传递给 set()
方法的参数。this
绑定在 handler 对象上。
返回值
set()
方法应当返回一个布尔值。
- 返回
true
代表属性设置成功。 - 在严格模式下,如果
set()
方法返回false
,那么会抛出一个TypeError
异常。
描述
handler.set()
方法用于拦截设置属性值的操作。
拦截
该方法会拦截目标对象的以下操作:
- 指定属性值:
proxy[foo] = bar
和proxy.foo = bar
- 指定继承者的属性值:
Object.create(proxy)[foo] = bar
Reflect.set()
约束
示例
以下代码演示如何捕获属性的设置操作。
js
var p = new Proxy(
{},
{
set: function (target, prop, value, receiver) {
target[prop] = value;
console.log("property set: " + prop + " = " + value);
return true;
},
},
);
console.log("a" in p); // false
p.a = 10; // "property set: a = 10"
console.log("a" in p); // true
console.log(p.a); // 10
规范
Specification |
---|
ECMAScript® 2026 Language Specification # sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver |