ES6代理返回值中的handlet.set

时间:2016-11-28 20:00:41

标签: javascript es6-proxy

在此代码中

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或""(空字符串)我收到错误

  

未捕获的TypeError:'设置'代理人:陷阱返回虚假财产'状态'(...)

2)在规范中,据说我应该返回一个布尔值。但在我的情况下,在set()方法中,我不返回任何布尔值。在这种情况下,为什么这个代码有效?

1 个答案:

答案 0 :(得分:4)

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

作为MDN states

  

在严格模式下,来自set处理程序的错误返回值将引发TypeError异常。

MDN在这里有些不清楚,因为看起来任何虚假值(不只是false)都会导致set处理程序抛出TypeError。

您的代码适用于大多数情况,因为您要返回作业的结果。 ninja.test = 'string'将返回string,这是真实的。

要解决此问题,只需将您的设置功能更改为以下内容:

set(target, property, value) {
  report(`Writing value ${value} to ${property}`);
  const param = target;
  param[property] = value;
  return true;
}