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

View in English Always switch to English

handler.preventExtensions()

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2016年9月以降、すべてのブラウザーで利用可能です。

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

試してみましょう

const monster = {
  canEvolve: true,
};

const handler = {
  preventExtensions(target) {
    target.canEvolve = false;
    Object.preventExtensions(target);
    return true;
  },
};

const proxy = new Proxy(monster, handler);

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

Object.preventExtensions(proxy);

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

構文

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

引数

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

target

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

返値

preventExtensions() メソッドは、操作が成功したかどうかを示す Boolean を返す必要があります。それ以外の値は論理値に変換されます

多くの操作(Object.preventExtensions() を記載する)は、内部メソッド [[PreventExtensions]]false を返した場合、TypeError が発生します。

解説

介入

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

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

不変条件

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

  • 結果は、ターゲットオブジェクトに対して handler.preventExtensions() を呼び出した後、 Reflect.isExtensible()false を返す場合のみ true になります。

preventExtensions のトラップ

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

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

console.log(Object.preventExtensions(p));
// "called"
// false

以下のコードは不変条件に違反しています。

js
const p = new Proxy(
  {},
  {
    preventExtensions(target) {
      return true;
    },
  },
);

Object.preventExtensions(p); // TypeError is thrown

仕様書

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

ブラウザーの互換性

関連情報