<!DOCTYPE HTML>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>屬性類型</title></head> <body><script type="text/javascript" charset="utf-8">/*** ECMAScript 中有兩種屬性:數據屬性和訪問器屬性。* * 要修改屬性默認的特性,必須使用ECMAScript5的Object.defineProperty()方法。* 語法:Object.defineProperty(屬性所在的對象,屬性名字,描述符對象);* 注意:描述符對象的屬性必須是:configurable、enumerable、writable 和 value 。* * 描述符對象屬性:* configurable:[true|false]表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。* enumerable:[true|false]表示能否通過 for-in 循環返回屬性。* writable:[true|false]表示能否修改屬性的值。* value:包含這個屬性的數據值,讀取屬性值得時候,從這個位置讀;寫入屬性值得時候,把新值保存在這個位置。這個特性的默認值為undefined。*/var person = {};//定義屬性特性Object.defineProperty(person,"name",{writable:false, //不可寫value:"張三" //屬性的值為"張三"});console.log(person.name); person.name = "李四";console.log("新賦值后:"+person.name);/********************* 【開始】運行結果 ********************張三新賦值后:張三********************* 【結束】運行結果 ********************/
</script> <script type="text/javascript" charset="utf-8">var person1 = {};//定義屬性特性//注: 一旦把屬性定義為不可配置,就不能再把它變回可配置了,此時,再調用 Object.defineProperty() 方法修改除 writable 之外的特性,都會導致錯誤。Object.defineProperty(person1,"name",{configurable:false, //不能從對象中刪除屬性value:"張三1" //屬性的值為"張三1"});console.log(person1.name); delete person.name;console.log("刪除屬性后:"+person1.name);//從定義屬性特性(運行時報錯)Object.defineProperty(person1,"name",{configurable:true, //可以從對象中刪除屬性value:"張三2" //屬性的值為"張三2"});console.log("從定義屬性特性后:"+person1.name);/********************* 【開始】運行結果 ********************張三1刪除屬性后:張三1TypeError: can't redefine non-configurable property "name"Object.defineProperty(person1,"name",{********************* 【結束】運行結果 ********************/
</script> <script type="text/javascript" charset="utf-8">/*** 訪問器屬性*/var book = {_year:2004,edition:1};//定義訪問器屬性/*** 訪問器屬性有如下4個特性。* configurable:[true|false]表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數據屬性。* enumerable:[true|false]表示能否通過 for-in 循環返回屬性。* get:在讀取屬性是調用的函數,默認值為 undefined。* set:在寫入屬性是調用的函數,默認值為 undefined。* */Object.defineProperty(book,"year",{get:function(){return this._year;},set:function(val){if(val > 2000){this._year = val;this.edition = val - 2000;}}});book.year = 2005;console.log(book);console.log(book.year);console.log(book.edition);/********************* 【開始】運行結果 ********************Object { _year=2005, edition=5}20055********************* 【結束】運行結果 ********************/
</script><script type="text/javascript" charset="utf-8">/*** 定義多個屬性Object.defineProperties()方法。* 語法:Object.defineProperties(添加和修改其屬性的對象,對象的屬性);*/var book1 = {};Object.defineProperties(book1,{//數據屬性_year:{writable:true, // 不寫的話默認為 falsevalue:2000},//數據屬性edition:{writable:true,value:0},//訪問器屬性year:{get:function(){return this._year;},set:function(newVal){if(newVal > this._year){this.edition += (newVal - this._year)*2;this._year = newVal;}}}});book1.year = 2005;console.log("year:"+book1.year+",edition:"+book1.edition);book1.year = 2007;console.log("year:"+book1.year+",edition:"+book1.edition);//讀取屬性的特性var descriptor = Object.getOwnPropertyDescriptor(book1,"_year");console.log(descriptor.value); //2007console.log(descriptor.configurable); //falseconsole.log(typeof(descriptor.get)); //undefinedvar descriptor = Object.getOwnPropertyDescriptor(book1,"year");console.log(descriptor.value); //undefinedconsole.log(descriptor.configurable); //falseconsole.log(typeof(descriptor.get)); //function/********************* 【開始】運行結果 ********************year:2005,edition:10year:2007,edition:142007falseundefinedundefinedfalsefunction********************* 【結束】運行結果 ********************/
</script> </body>
</html>