handlet.set в ES6 Возвращаемое значение прокси
В этом коде
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 = '';
У меня есть два вопроса:
1) Почему, если я устанавливаю значение статуса свойства в последней строке в 0 или ""(пустая строка), я получаю ошибку
Uncaught TypeError: 'set' на прокси: ловушка вернула ложь для свойства 'status' (…)
2) В спецификации сказано, что я должен вернуть логическое значение. Но в моем случае в методе set () я не возвращаю никакого логического значения. В таком случае, почему этот код работает?
1 ответ
Вы получаете TypeError, потому что ""
это ложь Вы получите ту же ошибку, если попытаетесь установить значение свойства в 0
или же false
,
Как утверждает MDN
В строгом режиме ложное возвращаемое значение из обработчика набора вызовет исключение TypeError.
MDN здесь несколько неясен, так как кажется, что любая ложная ценность (не только false
) вызовет обработчик set для выдачи ошибки TypeError.
Ваш код работает в большинстве случаев, потому что вы возвращаете результат назначения. ninja.test = 'string'
вернусь string
что правда.
Чтобы решить эту проблему, просто измените свою функцию set на следующее:
set(target, property, value) {
report(`Writing value ${value} to ${property}`);
const param = target;
param[property] = value;
return true;
}