JavaScript の列挙型 は、名前付き定数のセットを定義する方法であり、関連する値のコレクションを表すためによく使用されます。 JavaScript には列挙型のサポートが組み込まれていませんが、オブジェクトまたは const 変数を使用して同様の機能を実現し、コードの可読性と保守性を向上させることができます。
で JavaScript , 列挙型または列挙型は、名前付き値の固定セットを表すために使用されます。ただし、列挙型は JavaScript にとってネイティブではないため、通常はオブジェクトまたは凍結された配列を使用して実装されます。
JavaScript で列挙型の不変性を確保するには、次のガイドラインに従うことができます。
Object.freeze() メソッド:
Enum のようなオブジェクトを作成する 1 つの方法は、定数のプロパティ値を持つプレーンな JavaScript オブジェクトを定義し、次を使用することです。 Object.freeze() それ以上の変更を防ぐため。これにより、オブジェクトとそのプロパティが変更または変更されなくなります。使用できます Object.freeze() メソッドを使用して、オブジェクトへの変更を防止します。オブジェクトがフリーズされると、そのプロパティの追加、変更、削除はできなくなります。このメソッドを使用して、Enum を表す不変オブジェクトを作成できます。
構文:
Object.freeze()>
Object.defineProperty() メソッド:
Object.defineProperty() メソッドを使用して、変更、追加、または削除できないプロパティを定義できます。このメソッドを使用すると、各 Enum 値の読み取り専用プロパティを作成できます。 Object.defineProperty() メソッドを使用して、変更、追加、または削除できないプロパティを定義できます。このメソッドを使用すると、各 Enum 値の読み取り専用プロパティを作成できます。
使用 TypeScript : TypeScript は、Enum のサポートを含む JavaScript のスーパーセットです。 TypeScript を使用すると、不変性を保証する方法で Enum を定義できます。
例 1: この例では、Object.freeze() を使用して DaysOfWeek という Enum オブジェクトを作成します。 Object.freeze() メソッドはオブジェクトを不変にするため、オブジェクトのプロパティを追加、変更、削除することはできません。
JavaScript
const DaysOfWeek = Object.freeze({ SUNDAY: 0, MONDAY: 1, TUESDAY: 2, WEDNESDAY: 3, THURSDAY: 4, FRIDAY: 5, SATURDAY: 6 }); // Try to modify the enum // This will not change the Sunday variable DaysOfWeek.SUNDAY = 7; console.log(DaysOfWeek.SUNDAY);>
出力:
0>
ES6 シンボル:
JavaScript で Enum を作成するもう 1 つのアプローチは、ES6 シンボルを使用することです。シンボルは複製できない一意の識別子であり、一意で不変であることが保証された定数値を定義するために使用できます。
例: この例では、オブジェクトへの変更を防ぐために、Object.freeze() を使用して myEnum という列挙型を定義しています。 Symbol() を使用して、列挙値ごとに一意のシンボルを作成します。
JavaScript const myEnum = Object.freeze({ FOO: Symbol('foo'), BAR: Symbol('bar'), BAZ: Symbol('baz') }); console.log(myEnum.FOO); // Symbol(foo) // Attempting to modify the enum // values will have no effect myEnum.FOO = Symbol('newFoo'); console.log(myEnum.FOO); // Symbol(foo) // Adding a new property to the enum // object will also have no effect myEnum.QUX = Symbol('qux'); console.log(myEnum.QUX); // undefined>
出力:
Symbol(foo) Symbol(foo) undefined>
クロージャーの使用:
クロージャを使用して列挙型を作成することもできます。クロージャは、外側の関数スコープ内の変数にアクセスできる関数です。値を返す内部関数を作成すると、外部関数のスコープ内の変数を読み取り専用にできます。
例: この例では、クロージャを使用して DaysOfWeek というオブジェクトを作成します。 days オブジェクトは外側の関数スコープで定義されており、関数の外側からはアクセスできません。内部関数 get は、days オブジェクトから指定された名前のプロパティの値を返します。 days オブジェクトには直接アクセスできないため、クロージャの外部から変更することはできません。
JavaScript const DaysOfWeek = (function () { const days = { SUNDAY: 0, MONDAY: 1, TUESDAY: 2, WEDNESDAY: 3, THURSDAY: 4, FRIDAY: 5, SATURDAY: 6 }; return { get: function (name) { return days[name]; } }; })(); // Try to modify the enum // This will not have any effect DaysOfWeek.SUNDAY = 7; console.log(DaysOfWeek.get('SUNDAY')); // Output: 0>
出力:
0>