設定 判定 | プロパティ操作 | strict モード エラー | ||
---|---|---|---|---|
変更 | 追加 | 削除 | ||
seal【封印】 isSealed【封印 判定】 | ○ | × | × | TypeError 例外 |
freeze【プロパティ凍結】 isFrozen【プロパティ凍結 判定】 | × | × | × | TypeError 例外 |
preventExtensions【拡張(プロパティ追加)不可 設定】 isExtensible【拡張(プロパティ追加)可否】 | ○ | × | ○ | TypeError 例外 |
Object.seal ( O ) | ||
---|---|---|
ES2022 (13) | ES2021 (12) | ES2020 (11) |
Object.isSealed ( O ) | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
The Strict Mode of ECMAScript | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
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
}
}
設定 判定 | プロパティ操作 | strict モード エラー | ||
---|---|---|---|---|
変更 | 追加 | 削除 | ||
seal【封印】 isSealed【封印 判定】 | ○ | × | × | TypeError 例外 |
freeze【プロパティ凍結】 isFrozen【プロパティ凍結 判定】 | × | × | × | TypeError 例外 |
preventExtensions【拡張(プロパティ追加)不可 設定】 isExtensible【拡張(プロパティ追加)可否】 | ○ | × | ○ | TypeError 例外 |
Object.freeze ( O ) | ||
---|---|---|
ES2022 (13) | ES2021 (12) | ES2020 (11) |
Object.isFrozen ( O ) | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
The Strict Mode of ECMAScript | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
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
}
}
設定 判定 | プロパティ操作 | strict モード エラー | ||
---|---|---|---|---|
変更 | 追加 | 削除 | ||
seal【封印】 isSealed【封印 判定】 | ○ | × | × | TypeError 例外 |
freeze【プロパティ凍結】 isFrozen【プロパティ凍結 判定】 | × | × | × | TypeError 例外 |
preventExtensions【拡張(プロパティ追加)不可 設定】 isExtensible【拡張(プロパティ追加)可否】 | ○ | × | ○ | TypeError 例外 |
Object.preventExtensions ( O ) | ||
---|---|---|
ES2022 (13) | ES2021 (12) | ES2020 (11) |
Object.isExtensible ( O ) | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
The Strict Mode of ECMAScript | ||
ES2022 (13) | ES2021 (12) | ES2020 (11) |
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
}
}