1. 程式人生 > >原生JS的控制Object能否修改

原生JS的控制Object能否修改

三種方式可以控制
- 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》(第二版)第二章