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
      }
    }