原生JS的控制Object能否修改
阿新 • • 發佈:2019-01-09
三種方式可以控制
- Object.preventExtensions() 不能新增 可以修改
- Object.seal() 不能刪除 不能新增 可以修改
- Object.freeze() 一旦物件使用 就被認為是不可改變的 不能刪除 不能新增 不能修改
註釋:如果物件的屬性本身是一個物件的話 這個物件是可以更新的
Object.preventExtensions()
Object.preventExtensions() 不能新增 可以刪除 可以修改
var obj = {
name : 'quanquan'
};
//凍結obj
var obj2 = Object.preventExtensions(obj);
delete obj2.name;//可以刪除
obj2.name = '2018.04.09';
function makeTypeError(){
'use strict'; //嚴格模式
Object.definedProperty(obj2,'greeting',{value:'hello world'});//新增新屬性會丟擲異常
};
makeTypeError();
Object.seal()
Object.seal() 屬性不能刪除 不能新增 可以修改
var obj = {};
obj.greeting = 'welcome';
//凍結obj
Object.seal(obj);
obj.greeting = 'hello world';
/*無法將已有屬性轉換成存取器*/
Object.defineProperty(obj,'greeting',{get:function(){return 'hello world'}});
function makeTypeError(){
'use strict';
delete obj.greeting;//無法刪除
}
makeTypeError();
Object.freeze()
Object.freeze() 一旦使用物件就唄認為是不可改變的,無法再新增/刪除或者更新屬性 如果屬性本身是一個物件的話 那該物件可以更新,淺凍結
var obj = {
greeting :'welcome',
innerObj : {}
}
//凍結obj
Object.freeze(obj);
//修改物件中物件的屬性的值
obj.innerObj.name = 'quanquan';
delete obj.innerObj[name];//可以刪除
function makeTypeError(){
'use strict'
obj.innerObj.greeting = 'worked so far';可以修改屬性值是物件的屬性
obj.greeting = "welcome"; //不能修改屬性
delete obj.greeting;//不能刪除屬性
};
makeTypeError();
相關書籍:《精通javascript》(第二版)第二章