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 = '';

2 つの質問があります。

  1. 最後の行でプロパティのステータスを 0 または ""(空の文字列) に設定すると、エラーが発生するのはなぜですか?

キャッチされていない TypeError: 'set' on proxy: トラップがプロパティ 'status' に対して false を返しました(…)

  1. 仕様では、ブール値を返す必要があると書かれています。しかし、私の場合、 set() メソッドではブール値を返しません。その場合、なぜこのコードは機能するのでしょうか?
4

1 に答える 1

5

偽物であるため、 TypeErrorが発生して""います。プロパティ値を0またはに設定しようとすると、同じエラーが発生しますfalse

MDN が述べているよう

厳密モードでは、set ハンドラーからの戻り値が false の場合、TypeError 例外がスローされます。

MDN は、( だけでなくfalse) 偽の値が設定ハンドラに 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 に答える