handler.get()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

handler.get() は、オブジェクトの [[Get]] 内部メソッドに対するトラップです。プロパティアクセサーなどの操作で使用されます。

試してみましょう

const monster1 = {
  secret: "easily scared",
  eyeCount: 4,
};

const handler1 = {
  get: function (target, prop, receiver) {
    if (prop === "secret") {
      return `${target.secret.substring(0, 4)} ... shhhh!`;
    }
    return Reflect.get(...arguments);
  },
};

const proxy1 = new Proxy(monster1, handler1);

console.log(proxy1.eyeCount);
// Expected output: 4

console.log(proxy1.secret);
// Expected output: "easi ... shhhh!"

構文

js
new Proxy(target, {
  get(target, property, receiver) {
  }
})

引数

次の引数が get() メソッドに渡されます。 this はハンドラーにバインドされます。

target

ターゲットオブジェクトです。

property

プロパティの名称を表す文字列または Symbol です。

receiver

this 値はゲッター用です。 Reflect.get() を参照してください。これは通常、プロキシー自身か、プロキシーを継承するオブジェクトです。

返値

get() メソッドはどんな値でも返すことができます。

解説

介入

このトラップは下記の操作に介入できます。

  • プロパティアクセス: proxy[foo]proxy.bar
  • Reflect.get()

他にも、[[Get]] 内部メソッドを呼び出すあらゆる操作に介入できます。

不変条件

プロキシーの内部メソッド [[Get]] は、ハンドラー定義が以下の不変条件のいずれかに違反している場合、 TypeError が発生します。

  • このプロパティで報告される値は、ターゲットオブジェクトのプロパティが書き込み不可かつ構成不可の自身で所有するデータプロパティである場合、対応するターゲットオブジェクトのプロパティの値と同じでなければなりません。つまり、 Reflect.getOwnPropertyDescriptor() が、 target のプロパティに対して configurable: false, writable: false を返した場合、トラップは、 target のプロパティ記述子の value 属性と同じ値を返さなければなりません。
  • 対応するターゲットオブジェクトプロパティが、undefined ゲッターを持つ構成不可な自身のアクセサープロパティである場合、プロパティに対して報告される値は undefined でなければなりません。つまり、 Reflect.getOwnPropertyDescriptor() が、target のプロパティに対して configurable: false, get: undefined を返す場合、トラップは undefined を返す必要があります。

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

次のコードではプロパティ値の取得をトラップします。

js
const p = new Proxy(
  {},
  {
    get(target, property, receiver) {
      console.log(`called: ${property}`);
      return 10;
    },
  },
);

console.log(p.a);
// "called: a"
// 10

次のコードでは不変条件に違反します。

js
const obj = {};
Object.defineProperty(obj, "a", {
  configurable: false,
  enumerable: false,
  value: 10,
  writable: false,
});

const p = new Proxy(obj, {
  get(target, property) {
    return 20;
  },
});

p.a; // TypeError is thrown

仕様書

Specification
ECMAScript® 2025 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver

ブラウザーの互換性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
get

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

関連情報