1、基本用法簡介javascript
聲明一個簡單的對象,以下java
var obj = { name: 'ldld' }
咱們能夠用Object.defineProperty來聲明這個對象spa
var obj = {} Object.defineProperty(obj,'name',{ value:'ldld', writable:true, enumerable: true, configurable: true })
下列就這四個基本的配置簡單介紹一下指針
var obj = {} Object.defineProperty(obj,'name',{ value:'ldld', writable:false, enumerable: true, configurable: true }) obj.name // 'ldld' obj.name = 'LLLL'; // 這裏會修改失敗,嚴格模式下會報錯 TypeError console.log(obj.name) // 'ldld'
var obj = {} // 第一次設置操做configurable配置,設置爲false Object.defineProperty(obj,'name',{ value:'ldld', writable:true, enumerable: true, configurable: false }) obj.name // 'ldld' obj.name = 'LLLL'; // configurable: false 不影響writable屬性,這裏能夠設置成功 console.log(obj.name) // 'LLLL' // 第二次設置操做configurable配置,在第一步false基礎上改回true Object.defineProperty(obj,'name',{ value:'ldld', writable:true, enumerable: true, configurable: true // 如今咱們想改回來,可是很遺憾,不能。無論是嚴格模式仍是非嚴格模式都會報錯 })
此外,configurable會影響該對象屬性是否能夠被刪除對象
Object.defineProperty(obj,'name',{ value:'ldld', writable:true, enumerable: true, configurable: true }) delete obj.name; console.log(obj.name) // undefined ,說明刪除成功 Object.defineProperty(obj,'name',{ value:'ldld', writable:true, enumerable: true, configurable: false }) delete obj.name; console.log(obj.name) // ldld, 說明name屬性沒有被刪除
2、對象常量blog
const str = 'abc'; str = 'def'; // 報錯Uncaught TypeError: Assignment to constant variable. const obj = {name:'ldld'}; obj.name = { name:'ldld1234' // 這裏會修改爲功 }
const聲明的對象不可變,其實是能夠理解爲指針的不可變。ip
const str = 'abc'; 表示str指針指向棧中一個地址,值'abc';內存
str = 'def';表示str又指到另外一個地址,值爲'def',違反了不可變的規則,報錯了。it
const obj = {name:'ldld'};表示obj 對象指向一個堆 內存堆的obj的引用,無論怎麼改變obj裏面的值,在內存堆中地方始終不變,所以不會報錯。io
那麼問題來了,咱們想聲明一個不可變的對象,那怎麼辦?能夠參考以下:
var obj = {} Object.defineProperty(obj,'name',{ value:'ldld', writable:false, configurable: false }) // 此時問obj的name屬性不可改變了。
可是問題來來,name是不能再改變,可是咱們能夠給對象擴展其餘屬性。。。
3、防止對象擴展Object.preventExtensions
var obj = {} Object.defineProperty(obj,'name',{ value:'ldld', writable:false, configurable: false }) // 此時問obj的name屬性不可改變了。可是能夠擴展obj屬性 obj.age = 100; console.log(obj.age) // 100 Object.preventExtensions(obj); obj.sex = 'male'; console.log(obj.sex) // undefined,說明擴展失敗
4、密封Object.seal
顧名思義,密封一個對象,這個對象不能配置,不能擴展屬性,不能刪除屬性。可是能夠能夠修改熟悉過的值
Object.seal(obj)// 等同於以下:代碼1 + 代碼2 // 代碼1 Object.defineProperty(obj,'[該對象全部的屬性]',{ configurable: false // writable:true, // 此時默認爲true,能夠修改 }) // 代碼2 Object.preventExtensions(obj);
4、凍結Object.freeze(obj)
Object.freeze(obj)// 等同於以下:代碼1 + 代碼2 // 代碼1 Object.seal(obj) // 代碼2 Object.defineProperty(obj,'[該對象全部的屬性]',{ writable:false })
因而可知,凍結,就是定一個對象常量的終極大法。