Object.preventExtensions(obj)
讓一個對象變得不可擴展,也就是永遠不能在添加新的屬性
- obj
- 將要變得不可擴展的對象。
- 返回值
- 已經不可擴展的對象。
描述
- 如果一個對象可以添加新的屬性,則這個對象是可擴展的。Object.preventExtensions()將對象標記爲不可擴展,這樣它將永遠不會增加新的屬性。
- 注意,一般來說,不可擴展對象的屬性可能仍然可被刪除。嘗試將新屬性添加到不可擴展對象將靜默失敗或拋出TypeError
- Object.preventExtensions()僅阻止添加自身的屬性。但其對象類型的原型依然可以添加新的屬性
- 該方法使得目標對象的[[prototype]] 不可變。任何重新賦值[[prototype]] 操作都會拋出TypeError。這種行爲只針對內部的[[prototype]]屬性,目標對象的其他屬性將保持可變
- 一旦將對象變爲不可擴展的對象,就再也不能使其可擴展
示例
// Object.preventExtensions()將原對象變得不可擴展,並且返回原對象
var obj = {}
var obj2 = Object.preventExtensions(obj)
console.log(obj === obj2) // true
// 字面量方式定義的對象默認是可擴展的
var empty = {}
Object.isExtensible(empty) //true
// 但是可以改變
Object.preventExtensions(empty)
Object.isExtensible(empty) // false
// 使用Object.defineProperty方法爲一個不可擴展的對象增加新屬性會拋出異常
var nonExtensible = {
removable: true
};
Object.preventExtensions(nonExtensible);
// Object.defineProperty(nonExtensible, 'new', {
// value: 857857
// }) // 拋出異常:Cannot define property new, object is not extensible
// 在嚴格模式下,爲一個不可擴展對象增加新屬性會拋出TypeError
function fail() {
"use strict";
nonExtensible.newProperty = "FAIL"; // throws a TypeError: Cannot add property newProperty, object is not extensible
}
// fail();
// 不可擴展對象的原型是不可變的:
var fixed = Object.preventExtensions({})
fixed.__proto__ = { // <Object> is not extensible
oh: 'hai'
};