標籤:eset get java log var esc 配置 style 忽略
1 // 六:物件導向的程式設計 2 // 什麼是對象: “無序屬性的集合,他們可以包含基本值,對象或者函數”,嚴格來說,就相當於一組沒有特定順序的值,每個對象和方法都有一個特定的名字, 3 // 每個名字都映射一個值。 4 // 每個對象都是一個基於參考型別建立。 5 6 // 一、屬性類型(特性):資料屬性和訪問其屬性 這些屬性的特性是給jsvascript引擎用的,因此不是直接存取它們 7 // 1.資料屬性 8 // [[Configurabale]]:表明能否delete刪除屬性從而重新定義屬性;能否修改屬性的特性或者能否把屬性修改為訪問 9 // 其屬性: 10 // [[Enumerable]]: 表示能都通過 for-in進行迭代 11 // [[Writeble]]:能否修改屬性的值 12 // [[Value]]: 儲存屬性的值 13 14 // 要想修改上述屬性的特性,必須使用ECMAScript 5規定的 Object.defineProperty() 方法;這個方法接受三個參數 15 // ①屬性所在對象 ②屬性的名稱 ③一個描述符的對象,描述符特性必須以上四個中的一個或多個 16 17 var person = {}; 18 Object.defineProperty(person,"name",{ 19 //configurable:false, 20 writable:false, 21 value:"zhd" 22 }); 23 person.name = ‘qi‘; //由於writable的標記,此時是違法的 瀏覽器會忽略該句的執行,strict 模式下報錯 24 //delete person.name; //由於 configurable 該操作同樣違法 25 alert(person.name); // zhd 26 27 // 並且一旦標記configurable = false,無法通過Object.defineProperty()將configurable 更改為false, 28 // 一旦定義成不可配置類型的,就無法在將其改為可配置類型,此時在調用Object.defineProperty()修改除writable 29 // 之外的特性,都會出錯。 30 // 也就是說 可以多次調用Object.defineProperty()修改同一屬性,但是在configurable設定為flase,時,就會有 31 // 限制 32 //在調用Object.defineProperty()方法,如果不指定configurable,writable,Enumerable,則預設為false 33 //(字面量建立對象時,預設為true) 34 35 //2.訪問器屬性(getter/setter) 36 // [[Configurabale]]:表明能否delete刪除屬性從而重新定義屬性;能否修改屬性的特性或者能否把屬性修改為訪問器屬性: 37 //直接在對象上定義的屬性,這麼屬性值預設為true 38 // [[Enumerable]]: 表示能都通過 for-in進行迭代 直接在對象上定義的屬性,這麼屬性值預設為true 39 // [[Get]]:讀取屬性 值 預設為undefined 40 // [[Set]]: 寫入屬性 值 預設為undefined 41 //訪問器同樣也只能使用Object.defineProperty() 來設定 42 var book = { 43 _year:2016, //① 44 edition:1 45 }; 46 Object.defineProperty(book,"year",{ 47 get:function() { 48 return this._year; //② 49 }, 50 set:function(newValue) { 51 if(newValue > 2016){ 52 this._year = newValue; //③ 53 //console.log(newVlaue); 54 this.edition += newValue - 2016; 55 } 56 } 57 }); 58 book.year = 2017; 59 //book._year = 2016; //瀏覽器會直接忽略 60 alert(book.year); // 61 alert(book.edition); //2 意味著 設定一個屬性的同時,也可以改變其他屬性的值 62 63 //千萬不要忘記 ②②③處的"_",忘記後就出現 Maximum call stack size exceeded 錯誤。 64 //"_"用於表示只能通過對象方法訪問的屬性 _year為資料屬性 year為訪問器屬性 65 //直接存取 帶"_"的屬性, 瀏覽器就會直接忽略掉 66 //與java 私人變數提供訪問器類型,不過是將get/set方法變為了對year屬性的訪問來代替對 _year的訪問 67 //java: 68 //int getYear(){ return _year;} person.getYear() ==> person.year; 69 //void setYear(int value) {this._year = value;} person.setYear(2) ==> person.year = 2; 70 //不一定非要指定get/set方法:只有get時,屬性唯讀;只有set時,屬性只能寫入 71 //還有兩箇舊方法: 72 book.__defineGetter__("year",function () { 73 return this._year; 74 }); 75 book.__defineSetter__("year",function(newValue){ 76 if(newValue > 2016){ 77 this._year = newValue; 78 this.edition += newValue - 2016; 79 } 80 }); 81 82 //定義多個屬性 (在函數體內也可以直接地定義 get/set) 83 var book = {}; 84 Object.defineProperties(book,{ 85 _year:{ 86 value:2016 87 }, 88 edition:{ 89 value:1 90 }, 91 year:{ 92 get:function(){ 93 return this._year; 94 }, 95 set:function(newValue){ 96 if(newValue > 2016){ 97 this._year = newValue; 98 this.edition += newValue - 2016; 99 }100 }101 }102 });103 104 105 //讀取對象屬性的特性 傳回值時一個對象106 //如果是資料屬性,則有configurable,enumerable,writable和value107 //如果是訪問器屬性則有 configurable,enumerable,set和get108 //訪問資料屬性109 var descriptor = Object.getOwnPropertyDescriptor(book,"_year");110 alert(descriptor.value); //2016111 alert(descriptor.configurable); //false112 //alert(type descriptor.get); //"undefined"113 //訪問訪問器屬性114 var descriptor = Object.getOwnPropertyDescriptor(book,"year");115 alert(descriptor.value); //undefined116 alert(descriptor.enumerable); //false117 alert(typeof descriptor.get); //"function"118 alert(descriptor.get); //會傳回碼
javascript物件導向(一)