1. 程式人生 > >javascript中對象的屬性的特性

javascript中對象的屬性的特性

undefined javascript person false

enumberable: 表示是否能通過for-in循環返回屬性。默認為true

writable: 是否可以修改屬性, 默認為true

value: 包含這個屬性的數據值。讀取屬性值時3,從這個屬性讀,寫入屬性時,把新值保存到這個位置。默認值為undefine.

getter: 在讀取屬性時,調用的函數

setter: 在寫入屬性時調用的函數

特別註意:一旦調用了Object.defineProperty方法之後,那些未定義的特性值除了configurable為false之外,其他都為undefined;

2.修改單個屬性的特性:

必須使用Object.defineProperty()方法。這個方法接受3個參數: 屬性所在的對象,屬性的名字,和一個描述符對象。其中描述符對象的屬性必須是:configurable, enumberable, writable,value.設置其中一個或者多個值,可以修改對應的特性值。

修改writable特性,設置為false從而使得屬性值不可修改,如下所示:

技術分享

var person = {};
Object.defineProperty(person, "name", {
  writable: false,//設置屬性的特性為不可修改的  value: "Tom"  //把name屬性值設為Tom});
person.name = "Jany"; //試圖把name屬性值設置為Jany,但是失敗了.非嚴格模式下會忽略此語句,嚴格模式則會報錯的console.log(person.name); //結果仍然為Tom

技術分享

第2到第6行我們設置了name屬性的值為Tom,並且把它的writable特性設置為false,然後,我們試圖在地7行把它改Jany,但是,最終打印出來的結果仍然是zzy。

修改configurabel特性,設置為false使得屬性無法被delete(刪除),如下所示:

技術分享

var person = {};
Object.defineProperty(person, "name", {
  configurable: false, //把configurable設置為false  value: "Tom"
});
console.log(person.name); //打印結果為Tomdelete person.name; //試圖刪除name屬性console.log(person.name); //但是name仍然存在,打印出Tom

技術分享

如果我們把configurable屬性值改為true,則屬性可以被delete

技術分享

 var person = {};
Object.defineProperty(person, "name", {
  configurable: true,
  value: "Tom"
});
console.log(person.name); //打印出Tomdelete person.name; //試圖刪除name屬性console.log(person.name); //刪除成功,打印出udefined

技術分享

另外,一旦,我們我們把某個屬性的特性設置成了不可配置的,就再也不能把它變回可配置的了。此時,調用Object.defineProperty()方法修改除了writable之外的特性都會報錯。

如下:

技術分享

 person = {};
Object.defineProperty(person, "name", {
  configurable: ,
  value: "Tome"
});Object.defineProperty(person, "name", {
  configurable: ,
  value: "lyl"
});
 
console.log(person.name);

技術分享

我們在瀏覽器會看到如下的報錯信息:

修改getter和setter特性

技術分享

  book = {
  _year: 2004,   edition: 1  };
Object.defineProperty(book, "year", {
    get: () {
     ._year;
  },
    set: (newValue) {
    (newValue > 2004) {
      ._year = newValue;
      .edition += newValue - 2004;
    }
  }
 
});
 
book.year = 2005;
console.log(book.edition);

技術分享

3.同時定義(修改)多個屬性的特性

由於定義多個屬性的可能性很大,因此ES5有定義一個Object.defineProperties方法。利用這個方法可以通過描述符一次定義多個屬性。這個方法接受兩個對象的參數;第一個對象是要添加和修改器屬性的對象,第二個對象的屬性與第一個對象中要添加或者修改的順序一一對應。

技術分享

 book = {};
Object.defineProperties(book, {
    _year: {
    value: 2004
  },
    edition: {
    value: 1,
    writable:   },
    year: {
    get: () {
       ._year;
    },
    set: (newValue){
      (newValue > 2004) {
                ._year = newValue;
        .edition += newValue-2004;
      }
    }
  }
});
 
book.year = 2006;
console.log(book.edition);

技術分享

4.讀取屬性的特性


javascript中對象的屬性的特性