javascript中對象的屬性的特性

1.ES5的屬性特性包括下面六個瀏覽器

configurable: 表示可否經過delete來刪除屬性從而從新定義屬性,可以修改屬性的特性,默認爲true
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); //打印結果爲Tom
delete 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); //打印出Tom
delete person.name; //試圖刪除name屬性
console.log(person.name); //刪除成功,打印出udefined
另外,一旦,咱們咱們把某個屬性的特性設置成了不可配置的,就不再能把它變回可配置的了。此時,調用Object.defineProperty()方法修改除了writable以外的特性都會報錯。
以下:
var person = {};
//把person.name屬性的configurable設置爲false; Object.defineProperty(person,
"name", {   configurable: false,   value: "Tome" }); //而後試圖從新把person.name屬性的configurable設置爲true;可是瀏覽器出現報錯信息。 Object.defineProperty(person, "name", {   configurable: true,   value: "lyl" }); console.log(person.name);
 咱們在瀏覽器會看到以下的報錯信息:
 
修改getter和setter特性
 //定義一個對象book
var book = {
  _year: 2004, //出版年份
  edition: 1  //版本號
};

//定義year屬性的特性 Object.defineProperty(book,
"year", {
  //重寫get方法,即若是咱們試圖book.year獲取year值時,實質上是獲取book._year的值   get:
function() {     return this._year;   },
  //重寫了set方法,每當對book.year進行賦值時,則相應的修改book._year和book.edition的值   set:
function(newValue) {     if(newValue > 2004) {       this._year = newValue;       this.edition += newValue - 2004;     }   } }); book.year = 2005; console.log(book.edition); //2

 

3.同時定義(修改)多個屬性的特性
 
因爲定義多個屬性的可能性很大, 所以ES5有定義一個Object.defineProperties方法。利用這個方法能夠經過描述符一次定義多個屬性。這個方法接受兩個對象的參數;第一個對象是要添加和修改器屬性的對象,第二個對象的屬性與第一個對象中要添加或者修改的順序一一對應。
var book = {};
Object.defineProperties(book, {
  // 定義一個新的屬性_year,而且他的值爲2004   _year: {     value:
2004   },
  // 定義一個新的屬性edition,而且他的默認值是1,並且屬性值是可修改的   edition: {     value:
1,     writable: true// 可修改的   },
  // 定義一個新的屬性year,而且重寫了他的get和set方法   year: {     get:
function() {       return this._year;     },     set: function(newValue){       if(newValue > 2004) {         //alert("ok");         this._year = newValue;         this.edition += newValue-2004;       }     }   } }); book.year = 2006; console.log(book.edition);//3
 
4.讀取屬性的特性
 
讀取屬性的特性,使用Object.getOwnPropertyDescriptor方法

var
book = {};
// 爲該對象定義一些屬性 Object.defineProperties(book, {   _year: {     value:
2004   },   edition: {     value: 1,     writable: true// 可修改的   },   year: {     get: function() {       return this._year;     },     set: function(newValue){       if(newValue > 2004) {         //alert("ok");         this._year = newValue;         this.edition += newValue-2004;       }     }   } }); //獲取_year屬性的特性 var descriptor1 = Object.getOwnPropertyDescriptor(book, "_year"); console.log(descriptor1.configurable); //false console.log(descriptor1.enumberable); //undefinded console.log(descriptor1.writable); //false console.log(descriptor1.value); //2004 console.log(descriptor1.get); //undefined console.log(descriptor1.set); //undefined console.log("\n"); //獲取year屬性的特性 var descriptor2 = Object.getOwnPropertyDescriptor(book, "year"); console.log(descriptor2.configurable); //false console.log(descriptor2.enumberable); //undefined console.log(descriptor2.writable); //undefined console.log(descriptor2.value); //undefined console.log(descriptor2.get); //function() console.log(descriptor2.set); //function(value)
相關文章
相關標籤/搜索