seal【封印】
isSealed【封印 判定】
freeze【プロパティ凍結】
isFrozen【プロパティ凍結 判定】
preventExtensions【拡張(プロパティ追加)不可 設定】
isExtensible【拡張(プロパティ追加)可否】

seal【封印】
isSealed【封印 判定】

メモ

構文

Object.seal( O ) 

 入力のO (オブジェクト)
O オブジェクト

TypeError 例外
O (オブジェクト)がオブジェクト以外 
O (オブジェクト)がオブジェクト変換不可 
Object.isSealed( O ) 

 封印の判定結果 (false:封印 / true:その他)
O オブジェクト

TypeError 例外 O (オブジェクト)がオブジェクト以外 

// 封印なし
const obj1 = {
  prop1: 'Value1',
  prop2: 'Value2',
};
console.log(Object.isSealed(obj1));
// 出力:false
console.log(obj1);
// 出力:{prop1: 'Value1', prop2: 'Value2'}

// プロパティの変更・追加・削除
obj1.prop1 = 'ValueX'; // 変更 (成功)
obj1.propZ = 'ValueZ'; // 追加 (成功)
delete obj1.prop2;     // 削除 (成功)
console.log(obj1);
// 出力:{prop1: 'ValueX', propZ: 'ValueZ'}

// 封印
obj2 = {
  prop1: 'Value1',
  prop2: 'Value2',
};
Object.seal(obj2);
console.log(Object.isSealed(obj2));
// 出力:true
console.log(obj2);
// 出力:{prop1: 'Value1', prop2: 'Value2'}

// プロパティの変更・追加・削除
obj2.prop1 = 'ValueX'; // 変更 (成功)
obj2.propZ = 'ValueZ'; // 追加 (失敗)
delete obj2.prop2;     // 削除 (失敗)
console.log(obj2);
// 出力:{prop1: 'ValueX', prop2: 'Value2'}

// strict モード
strictMode();

function strictMode() {
  'use strict';
  try {
    obj2.propZ = 'ValueZ';
  } catch(e) {
    console.log(e);
    // TypeError: can't define property "propZ": Object is not extensible
  }
  try {
    delete obj2.prop2;
  } catch(e) {
    console.log(e);
    // TypeError: property "prop2" is non-configurable and can't be deleted
  }
}

freeze【プロパティ凍結】
isFrozen【プロパティ凍結 判定】

メモ

構文

Object.freeze( O ) 

 入力のO (オブジェクト)
O オブジェクト

TypeError 例外 O (オブジェクト)がオブジェクト以外 
Object.isFrozen( O ) 

 凍結の判定結果 (false:凍結 / true:その他)
O オブジェクト

TypeError 例外 O (オブジェクト)がオブジェクト以外 

// 凍結なし
const obj1 = {
  prop1: 'Value1',
  prop2: 'Value2',
};
console.log(Object.isFrozen(obj1));
// 出力:false
console.log(obj1);
// 出力:Object { prop1: "Value1", prop2: "Value2" }

// プロパティの変更・追加・削除
obj1.prop1 = 'ValueX'; // 変更 (成功)
obj1.propZ = 'ValueZ'; // 追加 (成功)
delete obj1.prop2;     // 削除 (成功)
console.log(obj1);
// 出力:Object { prop1: "ValueX", propZ: "ValueZ" }

// 凍結
obj2 = {
  prop1: 'Value1',
  prop2: 'Value2',
};
Object.freeze(obj2);
console.log(Object.isFrozen(obj2));
// 出力:true
console.log(obj2);
// 出力:{prop1: 'Value1', prop2: 'Value2'}

// プロパティの変更・追加・削除
obj2.prop1 = 'ValueX'; // 変更 (失敗)
obj2.propZ = 'ValueZ'; // 追加 (失敗)
delete obj2.prop2;     // 削除 (失敗)
console.log(obj2);
// 出力:{Object { prop1: "Value1", prop2: "Value2" }

// strict モード
strictMode();

function strictMode() {
  'use strict';
  try {
    obj2.prop1 = 'ValueXX';
  } catch(e) {
    console.log(e);
    // TypeError: "prop1" is read-only
  }
  try {
    obj2.propZ = 'ValueZ';
  } catch(e) {
    console.log(e);
    // TypeError: can't define property "propZ": Object is not extensible
  }
  try {
    delete obj2.prop2;
  } catch(e) {
    console.log(e);
    // TypeError: property "prop2" is non-configurable and can't be deleted
  }
}

preventExtensions【拡張(プロパティ追加)不可 設定】
isExtensible【拡張(プロパティ追加)可否】

メモ

構文

Object.preventExtensions( O ) 

 入力のO (オブジェクト)
O オブジェクト

TypeError 例外O (オブジェクト)がオブジェクト以外 
Object.isExtensible( O ) 

 拡張の可否 (false:拡張不可 / true:その他)
O オブジェクト

TypeError 例外 O (オブジェクト)がオブジェクト以外 

// 拡張(プロパティ追加)不可なし
const obj1 = {
  prop1: 'Value1',
  prop2: 'Value2',
};
console.log(Object.isExtensible(obj1));
// 出力:true
console.log(obj1);
// 出力:Object { prop1: "Value1", prop2: "Value2" }

// プロパティの変更・追加・削除
obj1.prop1 = 'ValueX'; // 変更 (成功)
obj1.propZ = 'ValueZ'; // 追加 (成功)
delete obj1.prop2;     // 削除 (成功)
console.log(obj1);
// 出力:Object { prop1: "ValueX", propZ: "ValueZ" }

// 拡張(プロパティ追加)不可
obj2 = {
  prop1: 'Value1',
  prop2: 'Value2',
};
Object.preventExtensions(obj2);
console.log(Object.isExtensible(obj2));
// 出力:false
console.log(obj2);
// 出力:{prop1: 'Value1', prop2: 'Value2'}

// プロパティの変更・追加・削除
obj2.prop1 = 'ValueX'; // 変更 (成功)
obj2.propZ = 'ValueZ'; // 追加 (失敗)
delete obj2.prop2;     // 削除 (成功)
console.log(obj2);
// 出力:Object { prop1: "ValueX" }

// strict モード
strictMode();

function strictMode() {
  'use strict';
  try {
    obj2.propZ = 'ValueZ';
  } catch(e) {
    console.log(e);
    // TypeError: can't define property "propZ": Object is not extensible
  }
}