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;
}
Другие вопросы по тегам