Proxy() コンストラクター

Proxy() コンストラクターは Proxy オブジェクトを生成するために使用します。

構文

new Proxy(target, handler)

引数

target

Proxy でラップするターゲットのオブジェクトです。あらゆる種類のオブジェクト、例えばネイティブ配列や関数、別のプロキシなどがなることができます。

handler

関数をプロパティとして持つオブジェクトで、その関数で、 Proxy p に対して操作が行われた場合の挙動を定義します。

解説

Proxy() コンストラクターを使用すると、新しい Proxy オブジェクトを生成することができます。このコンストラクターは 2 つの必須の引数を取ります。

  • target はプロキシを作成するオブジェクトです。
  • handler はプロキシのカスタム動作を定義するオブジェクトです。

handler を空にすると、ほとんどすべての点でターゲットとまったく同じように振る舞うプロキシを作成します。 handler オブジェクト上で関数群のいずれかを定義することで、プロキシの動作の特定の側面をカスタマイズすることができます。例えば、 get() を定義することで、 ターゲットのプロパティアクセサーのカスタマイズされたバージョンを提供することができます。

ハンドラー関数

この節では、定義することができるすべてのハンドラー関数を列挙します。ハンドラー関数は、対象オブジェクトの呼び出しをトラップするので、トラップと呼ばれることがあります。

handler.apply()

関数呼び出しのトラップです。

handler.construct()

new 演算子のトラップです。

handler.defineProperty()

Object.defineProperty のトラップです。

handler.deleteProperty()

delete 演算子のトラップです。

handler.get()

プロパティ値の取得のトラップです。

handler.getOwnPropertyDescriptor()

Object.getOwnPropertyDescriptor のトラップです。

handler.getPrototypeOf()

Object.getPrototypeOf のトラップです。

handler.has()

in 演算子のトラップです。

handler.isExtensible()

Object.isExtensible のトラップです。

handler.ownKeys()

Object.getOwnPropertyNamesObject.getOwnPropertySymbols のトラップです。

handler.preventExtensions()

Object.preventExtensions のトラップです。

handler.set()

プロパティ値の設定のトラップです。

handler.setPrototypeOf()

Object.setPrototypeOf のトラップです。

選択的にプロパティアクセサーのプロキシを行う

この例では、ターゲットは notProxiedproxied の 2 つのプロパティを持っています。 proxied に別の値を返し、それ以外のアクセスをターゲットに許可するハンドラーを定義します。

const target = {
  notProxied: "original value",
  proxied: "original value"
};

const handler = {
  get: function(target, prop, receiver) {
    if (prop === "proxied") {
      return "replaced value";
    }
    return Reflect.get(...arguments);
  }
};

const proxy = new Proxy(target, handler);

console.log(proxy.notProxied); // "original value"
console.log(proxy.proxied);    // "replaced value"

仕様書

ブラウザーの互換性

BCD tables only load in the browser

関連情報