Js中的Object.defineProperty

來源:互聯網
上載者:User

標籤:列印   des   on()   tab   console   目標   模式   log   注意   

通過Object.defineProperty為對象設定屬性,並同時規定屬性的屬性(可見度,可配置性,可枚舉性等)

備忘:如果通過var obj = {} obj.age = 18這種方式設定的屬性,他的可見度,可配置性,可枚舉性等都為true,相當於預設設定了本篇討論的各種屬性都為true

 

文法:Object.defineProperty(obj, prop, descriptor)

第一個參數:目標對象
第二個參數:需要定義的屬性或方法的名字。
第三個參數:目標屬性所擁有的特性。(descriptor)

descriptor:取值
  value:屬性的值
  writable:如果為false,屬性的值就不能被重寫,只能為唯讀了
  configurable:總開關,一旦為false,就不能再設定他的(value,writable,configurable)
  enumerable:是否能在for...in迴圈中遍曆出來或在Object.keys中列舉出來。
  get:設定方法
  set:擷取方法

 

descriptor預設值
  var a= {}
  Object.defineProperty(a,"b",{
    value:123
  })
  console.log(a.b);//123
只設定了value別的並沒有設定,它會預設把writable,configurable,enumerable都設定為false

 

configurable  總開關,第一次設定 false 之後,第二次什麼設定也不行了

備忘:如果是不可配置,可以把writable由true改為false但不能從false改為true
  var a= {}
  Object.defineProperty(a,"b",{
    configurable:false
  })
  Object.defineProperty(a,"b",{
    configurable:true
  })
  //error: Uncaught TypeError: Cannot redefine property: b

 


writable  如果設定為fasle,就變成唯讀了。。
  var a = {};
  Object.defineProperty(a, "b", {
    value : 123,
    writable : false
  });
  console.log(a.b);  // 列印 37
  a.b = 25;     // 沒有錯誤拋出(在strict 模式下會拋出)
  console.log(a.b);  // 列印 37, 賦值不起作用。

 

 

enumerable  定義了對象的屬性是否可以在 for...in 迴圈和 Object.keys() 中被枚舉。
  var a= {}
  Object.defineProperty(a,"b",{
    value:3445,
    enumerable:true
  })
  console.log(Object.keys(a));  // 列印["b"]
  改為false
  var a= {}
  Object.defineProperty(a,"b",{
    value:3445,
    enumerable:false
  })
  console.log(Object.keys(a));// 列印[]


set和get  賦值 或者 取值的時候會分別觸發 set 和 get 對應的函數
註:1.不能同時設定get和set與wriable或value,就是說想用get和set,就不能用wriable或value中的任何一個

  2.通過obj={} 這種形式去定義get/set方法的時候,和這裡不太一樣

    a.get/set和函數之間不需要冒號,例如obj={get name(){return "xiaol"}}
  var a= {}
  Object.defineProperty(a,"b",{
    set:function(newValue){
      console.log("你要賦值給我,我的新值是"+newValue)
    },
    get:function(){
      console.log("你取我的值")
      return 2   //注意這裡,我寫入程式碼返回2
    }
  })
  a.b =1   //列印 你要賦值給我,我的新值是1
  console.log(a.b) //列印 你取我的值
           //列印 2 注意這裡,和我的寫入程式碼相同的

Js中的Object.defineProperty

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.