2

在这段代码中

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 或“”(空字符串),为什么会出现错误?

未捕获的类型错误:代理上的“设置”:属性“状态”的陷阱返回错误(…)

  1. 在规范中它说我应该返回一个布尔值。但就我而言,在 set() 方法中,我不返回任何布尔值。在那种情况下,为什么这段代码有效?
4

1 回答 1

5

你得到一个 TypeError 因为""它是假的。如果您尝试将属性值设置为0or ,您将收到相同的错误false

正如MDN 所说

在严格模式下,来自 set 处理程序的 false 返回值将引发 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;
}
于 2016-11-28T20:38:37.110 回答