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

View in English Always switch to English

handler.isExtensible()

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。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 が発生

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-isextensible

ブラウザーの互換性

関連情報