JavaScript アドバンス

JS オブジェクトの保護

1. オブジェクト保護メソッド

オブジェクトの変更を制限するための主要なメソッドは以下の通りです。

// 再代入を防止
const car = {type:"Fiat", model:"500", color:"white"};

// オブジェクトへのプロパティ追加を防止する
Object.preventExtensions(object)

// オブジェクトにプロパティを追加できる(拡張可能)か判定する
Object.isExtensible(object)

// オブジェクトへのプロパティ追加および削除を防止する
Object.seal(object)

// オブジェクトがシール(封印)されているか判定する
Object.isSealed(object)

// オブジェクトに対するあらゆる変更を防止する
Object.freeze(object)

// オブジェクトがフリーズ(凍結)されているか判定する
Object.isFrozen(object)

2. const の使用

オブジェクトの変更を保護する最も一般的な方法は、const キーワード(Keyword)を使用することです。
const を使用すると、オブジェクト自体の再代入(Re-assignment)はできなくなりますが、プロパティの値を変更したり、プロパティを削除したり、新しいプロパティを作成したりすることは可能です。

3. JavaScript Object.preventExtensions()

Object.preventExtensions() メソッドは、オブジェクトに新しいプロパティを追加することを防止します。

// オブジェクトの作成
const person = {firstName:"John", lastName:"Doe"};

// 拡張の禁止
Object.preventExtensions(person);

// これを実行するとエラーがスローされます(ストリクトモード時)
person.nationality = "English";

配列もオブジェクトの一種であるため、配列の拡張を防止することも可能です。

// 配列の作成
const fruits = ["Banana", "Orange", "Apple", "Mango"];
Object.preventExtensions(fruits);

// これを実行するとエラーがスローされます
fruits.push("Kiwi");

Object.preventExtensions() メソッドは、非ストリクトモードではサイレントに失敗し、ストリクトモード(Strict Mode)では TypeError をスローします。

4. JavaScript Object.isExtensible()

Object.isExtensible() を使用して、オブジェクトが拡張可能かどうかを確認できます。
オブジェクトが拡張可能(新しいプロパティを追加できる状態)であれば true を返します。

// オブジェクトの作成
const person = {firstName:"John", lastName:"Doe"};

// 拡張の禁止
Object.preventExtensions(person);

// false を返します
let answer = Object.isExtensible(person);
// 配列の作成
const fruits = ["Banana", "Orange", "Apple", "Mango"];

// 拡張の禁止
Object.preventExtensions(fruits);

// false を返します
let answer = Object.isExtensible(fruits);

5. JavaScript Object.seal()

Object.seal() メソッドは、新しいプロパティの追加および既存プロパティの削除を防止します。
また、既存のプロパティを non-configurable(設定変更不可)にします。

"use strict"
// オブジェクトの作成
const person = {
  firstName: "John",
  lastName: "Doe",
  age: 50,
  eyeColor: "blue"
};

// オブジェクトをシール(封印)
Object.seal(person)

// プロパティの削除を試みるとエラーが発生します
delete person.age;

配列もオブジェクトであるため、シールすることが可能です。

// 配列の作成
const fruits = ["Banana", "Orange", "Apple", "Mango"];
Object.seal(fruits);

// これを実行するとエラーが発生します
fruits.push("Kiwi");

Object.seal() メソッドは、非ストリクトモードではエラーを出さずに失敗し、ストリクトモードでは TypeError をスローします。

6. JavaScript Object.isSealed()

Object.isSealed() メソッドを使用して、オブジェクトがシールされているかどうかを確認できます。

// オブジェクトの作成
const person = {firstName:"John", lastName:"Doe"};

// オブジェクトをシール
Object.seal(person);

// true を返します
let answer = Object.isSealed(person);

7. JavaScript Object.freeze()

Object.freeze() メソッドは、オブジェクトに対するあらゆる変更を防止します。
フリーズ(凍結)されたオブジェクトは読み取り専用(Read-only)となります。
プロパティの変更、追加、削除は一切許可されません。

"use strict"
// オブジェクトの作成
const person = {
  firstName: "John",
  lastName: "Doe",
  age: 50,
  eyeColor: "blue"
};

// オブジェクトをフリーズ(凍結)
Object.freeze(person)

// 値の変更を試みるとエラーが発生します
person.age = 51;

配列もオブジェクトであるため、フリーズさせることができます。

const fruits = ["Banana", "Orange", "Apple", "Mango"];
Object.freeze(fruits);

// これを実行するとエラーが発生します
fruits.push("Kiwi");

Object.freeze() メソッドは、非ストリクトモードではサイレントに失敗し、ストリクトモードでは TypeError をスローします。

8. JavaScript Object.isFrozen()

Object.isFrozen() メソッドを使用して、オブジェクトがフリーズされているかどうかを確認できます。

// オブジェクトの作成
const person = {firstName:"John", lastName:"Doe"};

// オブジェクトをフリーズ
Object.freeze(person);

// true を返します
let answer = Object.isFrozen(person);