1. 程式人生 > >javascript面向對象(一)

javascript面向對象(一)

onf ear 其他屬性 進行 bsp 程序設計 定義 int cee

  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的標記,此時是違法的 瀏覽器會忽略該句的執行,嚴格模式下報錯 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和value 107 //如果是訪問器屬性則有 configurable,enumerable,set和get 108 //訪問數據屬性 109 var descriptor = Object.getOwnPropertyDescriptor(book,"_year"); 110 alert(descriptor.value); //2016 111 alert(descriptor.configurable); //false 112 //alert(type descriptor.get); //"undefined" 113 //訪問訪問器屬性 114 var descriptor = Object.getOwnPropertyDescriptor(book,"year"); 115 alert(descriptor.value); //undefined 116 alert(descriptor.enumerable); //false 117 alert(typeof descriptor.get); //"function" 118 alert(descriptor.get); //會返回代碼

javascript面向對象(一)