javascript物件導向(一)

來源:互聯網
上載者:User

標籤: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物件導向(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.