このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

handler.isExtensible()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2016年9月⁩.

handler.isExtensible() は、オブジェクトの [[IsExtensible]] 内部メソッドに対するトラップです。Object.isExtensible() などの操作で使用されます。

試してみましょう

const monster = {
  canEvolve: true,
};

const handler = {
  isExtensible(target) {
    return Reflect.isExtensible(target);
  },
  preventExtensions(target) {
    target.canEvolve = false;
    return Reflect.preventExtensions(target);
  },
};

const proxy = new Proxy(monster, handler);

console.log(Object.isExtensible(proxy));
// 予想される結果: true

console.log(monster.canEvolve);
// 予想される結果: true

Object.preventExtensions(proxy);

console.log(Object.isExtensible(proxy));
// 予想される結果: false

console.log(monster.canEvolve);
// 予想される結果: false

構文

js
new Proxy(target, {
  isExtensible(target) {
  }
})

引数

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

target

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

返値

isExtensible() メソッドは、対象オブジェクトが拡張可能かどうかを示す論理値 (Boolean) を返す必要があります。それ以外の値は論理型に変換されますisExtensible メソッドは論理値を返さなければなりません。

解説

介入

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

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

不変条件

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

  • 結果は、対象とするオブジェクトに対して Reflect.isExtensible() を実行した結果である必要があります。

getOwnPropertyNames のトラップ

次のコードでは Object.isExtensible() をトラップします。

js
const p = new Proxy(
  {},
  {
    isExtensible(target) {
      console.log("called");
      return true;
    },
  },
);

console.log(Object.isExtensible(p));
// "called"
// true

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

js
const p = new Proxy(
  {},
  {
    isExtensible(target) {
      return false;
    },
  },
);

Object.isExtensible(p); // TypeError が発生

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-isextensible

ブラウザーの互換性

関連情報