0Pricing
JavaScript Academy · レッスン

Object.freeze と seal

オブジェクトの変更を防ぎます。

「Object.freeze と seal」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全4レッスンが含まれています。

オブジェクトを freeze する理由

不変性とは、作成後にデータを変更できないことです。意図しない変更を防ぎ、コードを理解しやすくし、さまざまなバグを防ぎます。

JavaScript には、オブジェクトを固定するための Object.freeze と Object.seal があります。

Object.freeze の基本

Object.freeze はオブジェクトを完全に読み取り専用にします。プロパティの追加、削除、変更はできません。戻り値は、freeze された同じオブジェクトです。

const user = Object.freeze({ name: 'Ada', age: 36 });
user.age = 99;
console.log(user.age);

isFrozen で確認する

Object.isFrozen は、オブジェクトが freeze されているかどうかを示します。更新を試みる前に確認する場合に便利です。

const config = Object.freeze({ debug: false });
const settings = { theme: 'dark' };

console.log(Object.isFrozen(config));
console.log(Object.isFrozen(settings));

暗黙的な失敗と strict モードでの失敗

非 strict モードのコードでは、freeze されたオブジェクトへの書き込みは暗黙的に失敗します。strict モードでは TypeError がスローされます。どちらの場合も値は変わりません。

'use strict';
const frozen = Object.freeze({ x: 1 });
try {
  frozen.x = 2;
} catch (e) {
  console.log(e.name);
}
console.log(frozen.x);

freeze は新しいプロパティを阻止する

freeze すると、プロパティの追加もできなくなります。新しいキーは単に出現しません。

const point = Object.freeze({ x: 0 });
point.y = 5;
console.log(point.y);
console.log(Object.keys(point));

freeze は削除を阻止する

freeze されたオブジェクトからプロパティを削除することもできません。プロパティはそのまま残ります。

const obj = Object.freeze({ keep: 'me' });
delete obj.keep;
console.log(obj.keep);

Object.seal は異なる

Object.seal は freeze より制限が緩やかです。プロパティを追加または削除することはできませんが、既存の値は変更できます。

const sealed = Object.seal({ count: 1 });
sealed.count = 2;
sealed.extra = 3;

console.log(sealed.count);
console.log(sealed.extra);

isSealed で確認する

Object.isSealed は、オブジェクトが seal されているかどうかを示します。freeze されたすべてのオブジェクトは seal もされていますが、その逆は成り立たない点に注意してください。

const sealed = Object.seal({ a: 1 });
const frozen = Object.freeze({ b: 2 });

console.log(Object.isSealed(sealed));
console.log(Object.isSealed(frozen));
console.log(Object.isFrozen(sealed));

freeze と seal のまとめ

freeze: 追加、削除、変更ができません。seal: 追加と削除はできませんが、変更はできます。構造を固定しつつ値は変化させたい場合は seal を選択してください。

const f = Object.freeze({ v: 1 });
const s = Object.seal({ v: 1 });

f.v = 100;
s.v = 100;

console.log('frozen v:', f.v);
console.log('sealed v:', s.v);

preventExtensions

最も制限の緩やかなロックは Object.preventExtensions です。プロパティは追加できませんが、既存のプロパティは変更も削除もできます。3つの中では最も弱い制限です。

const obj = Object.preventExtensions({ a: 1 });
obj.a = 2;
obj.b = 3;

console.log(obj.a);
console.log(obj.b);
console.log(Object.isExtensible(obj));

重要な理由

設定値や定数を freeze すると、コードベース全体での意図しない編集を防げます。ただし、Object.freeze は浅い処理であるため、ネストされたオブジェクトは変更可能なままです。次にこの問題を解決します。

const SETTINGS = Object.freeze({ maxRetries: 3 });
function tryUpdate() {
  SETTINGS.maxRetries = 10;
}
tryUpdate();
console.log(SETTINGS.maxRetries);

クイックチェック

Object.freeze と Object.seal の違いは何ですか。

まとめ: freeze と seal

オブジェクトを固定する方法を学びました。

  • Object.freeze: 追加、削除、変更ができません。isFrozen で確認します。
  • Object.seal: 追加と削除はできませんが、変更はできます。
  • preventExtensions: 追加だけを阻止します。
  • 3つとも浅い処理であるため、次は deepFreeze について学びます。

よくある質問

「Object.freeze と seal」レッスンは無料ですか?

はい。「Object.freeze と seal」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。

「Object.freeze と seal」で何を学びますか?

オブジェクトの変更を防ぎます。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Object.freeze と seal」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Object.freeze と seal
  2. 浅い凍結と深い凍結
  3. イミュータブルな更新パターン
  4. 深いコピーのための structuredClone
← JavaScript Academyに戻る