javascript-object對象屬性操做之Object.defineProperty

 1、基本用法簡介javascript

    聲明一個簡單的對象,以下java

var obj = {
  name: 'ldld'
}

 咱們能夠用Object.defineProperty來聲明這個對象spa

var obj = {}
Object.defineProperty(obj,'name',{
  value:'ldld',
  writable:true,
  enumerable: true,
  configurable: true
})

 下列就這四個基本的配置簡單介紹一下指針

  1.   value:初始值
  2. writable:是否能夠修改該屬性的值
    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'
  3.    enumerable:是否可枚舉,這個是否能遍歷到該屬性(for)
  4.   configurable : 這個得重點講一下
    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
})

  

因而可知,凍結,就是定一個對象常量的終極大法。

相關文章
相關標籤/搜索