JavaScript では、オブジェクトの拡張可能属性を使用して、新しいプロパティをオブジェクトに動的に追加できるかどうかを示します。 ECMAScript 3 標準では、すべてのオブジェクトが拡張可能です。 ECMAScript 5 標準では、すべてのオブジェクトはデフォルトで引き続き拡張可能ですが、この属性は設定することで変更できます。
オブジェクトが拡張可能かどうかをクエリするには、Object.isExtensible() ステートメントを使用できます。
オブジェクトを拡張不可能にするには、Object.preventExtensions() ステートメントを使用できます。
Object.preventExtensions() には逆の操作ステートメントがないため、オブジェクトが拡張不可に設定されると、再度拡張可能に設定する方法がないことに注意してください。
Object.preventExtensions() ステートメントのスコープはオブジェクト自体であり、プロトタイプ オブジェクトは影響を受けません。オブジェクトが拡張不可に設定されている場合でも、プロパティはそのプロトタイプ オブジェクトに動的に追加でき、これらの動的に追加されたプロパティは引き続きオブジェクトによって継承されます。
Object.seal() および Object.freeze()
Object.preventExtensions() は、新しいプロパティがオブジェクトに動的に追加されるのを防ぐことができます。この操作に加えて、JavaScript にはオブジェクトを保護するための 2 つのより厳密な操作、Object.seal() と Object.freeze() があります。
Object.seal() の機能は、Object.preventExtensions() に基づいて、すべてのオブジェクト自身のプロパティの構成可能なプロパティを false に設定することです。 Object.preventExtensions() 操作と同様、Object.seal() には逆の操作がないため、オブジェクトがいったんシールされると、その状態を復元することはできません。 JavaScript では、Object.isSealed() を使用して、オブジェクトがシールされているかどうかをクエリできます。
Object.freeze() の機能は、Object.seal() に基づいてすべてのオブジェクト自体のプロパティを読み取り専用に設定することです。 Object.seal() および Object.preventExtensions() 操作と同様、Object.freeze() には逆の操作がないため、オブジェクトが一度フリーズされると、その状態を復元することはできません。 JavaScript では、Object.isFrozen() を使用して、オブジェクトが凍結されているかどうかをクエリできます。
Object.preventExtensions()、Object.seal()、Object.freeze() のいずれであっても、そのスコープはオブジェクト自体であり、オブジェクトのプロトタイプ オブジェクトは影響を受けません。