不可擴展對象
Object.preventExtensions()
僅阻止添加自身的屬性。但屬性仍然可以添加到對象原型。
可以用 Object.isExtensible(obj) 來判斷對象是否可擴展
密封對象
Object.seal()
密封對象不可擴展,而且已有的屬性成員[[configurable]]特性將被設置成false
可以用 Object.isSealed() 來判斷對象是否已經被密封
凍結對象
Object.freeze()
凍結的對象既不可以擴展,又是密封的,而且對象數據屬性的[[writable]]特性會被設置為false。
由於訪問器屬性沒有writable,所以訪問器屬性還是可以用的:
let _obj = {name: 123}
let obj = {}
Object.defineProperty(obj, 'name', {
configurable: true,
enumerable: true,
set(val) {
_obj.name = val;
},
get() {
return _obj.name
}
})
Object.freeze(obj);
obj.name //123
obj.name = 666;
obj.name // 666
總結:
| 方法名 | 增(extensible) | 刪(configurable) | 改(writable) |
| Object.preventExtensions | × | √ | √ |
| Object.seal | × | × | √ |
| Object.freeze | × | × | × |
