通常來講,默認狀況下,對象都是可拓展的,咱們能夠爲其屬性進行增刪改等操做,也能夠更改他們原型的指向,如何讓一個對象變得不可拓展呢,咱們能夠使用ES5提供的幾個方法,來保證鎖定的對象是不可拓展的javascript
Object.preventExtensionsjava
Object.preventExtensions能夠鎖定對象,設置對象的不可拓展,能夠阻止爲對象添加新的屬性,非嚴格模式下會默默不起做用,可是嚴格模式下會報錯,能夠用Object.isExtensible判斷對象是否可拓展code
var person = { name: "cala" }; Object.preventExtensions(person); person.name = "John"; person.age = 24; // 嚴格模式下會報錯: TypeError: Cannot add property age, object is not extensible console.log(person) // {name: "John"}
Object.seal對象
Object.seal和上面的Object.preventExtensions方法做用是同樣,字面意思是密封,也是用來防止對象被拓展,另外還能夠阻止對象已有屬性和方法的刪除,能夠用Object.isSealed判斷對象是否可拓展ip
var person = { name: "cala" }; Object.seal(person); console.log(Object.isExtensible(person)); // false console.log(Object.isSealed(person)); // true delete person.name // 刪除屬性失敗 嚴格模式下 Uncaught TypeError: Cannot delete property 'name' of #<Object> person.age = 30; // // 嚴格模式下會報錯: TypeError: Cannot add property age, object is not extensible console.log(person) // {name: "cala"}
Object.freeze原型
做用與上述兩個方法大體相同,字面意思是冰凍,還能夠阻止對象的屬性和方法被修改,能夠用Object.isFrozen判斷對象是否可拓展io
var person = { name: "cala" }; Object.freeze(person); console.log(Object.isExtensible(person)); // false console.log(Object.isSealed(person)); // true console.log(Object.isFrozen(person)); // true person.name = "xyz"; person.age = 30; delete person.name //上述三個操做,非嚴格模式不起做用,嚴格模式會報錯 console.log(person) // {name: "cala"}
總的來講,上述三個操做方法preventExtensions,seal,freeze能夠設置對象的不可拓展性,而且每一個方法都針對對象的不可拓展有着不一樣的限制,另外還有三個判斷方法,isExtensible,isSealed,isFrozen來對對象進行操做,返回Boolean值,來判斷對象是否可拓展console