handler.set 在 ES6 代理中 return 值
handler.set in ES6 Proxy return value
在此代码中
function report(message) {
console.log(message);
}
function makeLoggable(target) {
return new Proxy(target, {
get(target, property) {
report(`Reading ${property}`);
const param = target;
return param[property];
},
set(target, property, value) {
report(`Writing value ${value} to ${property}`);
const param = target;
return param[property] = value;
},
});
}
let ninja = { name: 'Jack' };
ninja = makeLoggable(ninja);
console.assert(ninja.name === 'Jack', 'Our ninja Jack');
ninja.status = '';
我有两个问题:
- 如果我在最后一行将 属性 状态设置为 0 或“”(空字符串),为什么会出现错误?
Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'status'(…)
- 在规范中它说我应该 return 一个布尔值。但就我而言,在 set() 方法中我没有 return 任何布尔值。在那种情况下,为什么此代码有效?
你得到一个 TypeError 因为 ""
是假的。如果您尝试将 属性 值设置为 0
或 false
,您将收到相同的错误。
In strict mode, a false return value from the set handler will throw a TypeError exception.
MDN 在这里有些不清楚,因为似乎任何虚假值(不仅仅是 false
)都会导致设置处理程序抛出 TypeError。
您的代码适用于大多数情况,因为您正在 return 计算赋值的结果。 ninja.test = 'string'
将 return string
这是真实的。
为了解决这个问题,只需将您的设置函数更改为以下内容:
set(target, property, value) {
report(`Writing value ${value} to ${property}`);
const param = target;
param[property] = value;
return true;
}
在此代码中
function report(message) {
console.log(message);
}
function makeLoggable(target) {
return new Proxy(target, {
get(target, property) {
report(`Reading ${property}`);
const param = target;
return param[property];
},
set(target, property, value) {
report(`Writing value ${value} to ${property}`);
const param = target;
return param[property] = value;
},
});
}
let ninja = { name: 'Jack' };
ninja = makeLoggable(ninja);
console.assert(ninja.name === 'Jack', 'Our ninja Jack');
ninja.status = '';
我有两个问题:
- 如果我在最后一行将 属性 状态设置为 0 或“”(空字符串),为什么会出现错误?
Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'status'(…)
- 在规范中它说我应该 return 一个布尔值。但就我而言,在 set() 方法中我没有 return 任何布尔值。在那种情况下,为什么此代码有效?
你得到一个 TypeError 因为 ""
是假的。如果您尝试将 属性 值设置为 0
或 false
,您将收到相同的错误。
In strict mode, a false return value from the set handler will throw a TypeError exception.
MDN 在这里有些不清楚,因为似乎任何虚假值(不仅仅是 false
)都会导致设置处理程序抛出 TypeError。
您的代码适用于大多数情况,因为您正在 return 计算赋值的结果。 ninja.test = 'string'
将 return string
这是真实的。
为了解决这个问题,只需将您的设置函数更改为以下内容:
set(target, property, value) {
report(`Writing value ${value} to ${property}`);
const param = target;
param[property] = value;
return true;
}