1
proxy = new Proxy({}, {
  deleteProperty(target, propKey){
    console.log(arguments);

    return true;
  }
});

proxy.xx = 3;

delete proxy.xx; // log and return true

proxy.xx // 3

コードと同様に、削除操作は効果がありません。

MDNで削除演算子を読みました。

delete 演算子は、オブジェクトから特定のプロパティを削除します。削除が成功すると true が返され、それ以外の場合は false が返されます。ただし、次のシナリオを考慮することが重要です。

  • 削除しようとしているプロパティが存在しない場合、delete は効果がなく、true を返します。

  • オブジェクトのプロトタイプ チェーンに同じ名前のプロパティが存在する場合、削除後、オブジェクトはプロトタイプ チェーンのプロパティを使用します (つまり、削除は自身のプロパティにのみ影響します)。

  • var で宣言されたプロパティは、グローバル スコープまたは関数のスコープから削除できません。

    • そのため、delete はグローバル スコープ内の関数を削除できません (これが関数定義または関数式の一部であるかどうかに関係なく)。

    • オブジェクトの一部である関数 (グローバル スコープを除く) は、delete で削除できます。

  • let または const で宣言されたプロパティは、それらが定義されたスコープから削除できません。

  • 構成不可能なプロパティは削除できません。これには、Math、Array、Object などの組み込みオブジェクトのプロパティと、Object.defineProperty() などのメソッドで構成不可能として作成されるプロパティが含まれます。

私のコードは上記のものに属していないと思うので、どう説明すればいいですか? ありがとう。

4

2 に答える 2

3

プロパティを削除する場合は、 を呼び出す必要がありますReflect.deleteProperty()。戻るtrueだけでは削除されず、Reflect.deleteProperty()returnの呼び出しのみが行われますtrue:

const proxy1 = new Proxy({}, {
  deleteProperty(target, propKey) {
    return true;
  },
});

proxy1.xx = 3;
// true, because deleteProperty trap returns true.
console.log(Reflect.deleteProperty(proxy1, 'xx'));
// 3, because it wasn't actually deleted.
console.log(proxy1.xx); // 3

const proxy2 = new Proxy({}, {
  deleteProperty(target, propKey) {
    Reflect.deleteProperty(target, propKey);
    return false;
  },
});

proxy2.xx = 3;
// false, because deleteProperty trap returns false.
console.log(Reflect.deleteProperty(proxy2, 'xx'));
// undefined, because it was deleted.
console.log(proxy2.xx);

于 2016-11-17T13:06:07.287 に答える
1

仕様では、プロキシで実装されたdeletePropertyハンドラーの場合、このハンドラーはパラメーターtarget,を使用して呼び出すだけであることがわかります。Pここで、target- はソース オブジェクトであり、P削除するプロパティです。

サンプルのように、この handler から戻るとtrue、何も起こりません。

したがって、このハンドラーを追加する場合は、必要なプロパティを手動で削除するか、 Reflectで近い回答のように削除する必要があります。

proxy = new Proxy({}, {
  deleteProperty(target, propKey) {
    console.log(target, propKey);
    delete target[propKey];
    return true;
  }
});

proxy.xx = 3;
console.log('before', proxy.xx);
console.log('delete', delete proxy.xx); // log and return true

console.log('after', proxy.xx); // 3
.as-console-wrapper {
  top: 0;
  height: 100% !important;
}

于 2016-11-17T13:11:24.643 に答える