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

関連情報