《JavaScript 語言精粹》 學習筆記 —— 第五章 繼承

來源:互聯網
上載者:User

第五章 繼承

5.1、繼承的兩個作用:1、代碼重用;2、類型系統規範。
5.2、JavaScript是一門弱類型的語言。不需要類型轉換。對象的起源是無關緊要的。
5.3、JavaScript是一門基於原型的語言,而不是基於類的語言。
5.4、JavaScript的prototype。
當一個函數對象被建立時,Function 構造器產生的函數對象會運行類似這樣的一些代碼:

this.prototype = { constructor : this };

新函數對象被賦予一個 prototype 屬性,其值是包含一個 constructor 屬性且屬性值為該新函數對象。該 prototype 對象是存放整合特徵的地方。因為JavaScript語言沒有提供一種方法去確定哪個函數是打算用來作構造器的,所以每個函數都會得到一個prototype對象。
5.5、當採用構造器調用模式,即使用 new 首碼 去調用一個函數時,將修改函數執行方式。
5.6、定義一個構造器,擴充它的原型:

var Mammal = function (name) {this.name = name;};Mammal.prototype.get_name = function () {return this.name;};Mamal.prototype.says = function () {return this.saying || '';};再構造一個執行個體:var myMammal = new Mammal('Herb the Mamal');var name = myMammal.get_name(); // 'Herb the Mammal';document.writeln(name);構造一個偽類來繼承Mammal,這是通過定義它的constructor函數並替換它的prototype為一個Manmal的執行個體來實現的:var Cat = function (name) {this.name = name;this.saying = 'meow';};// 替換 Cat.prototype 為一個新的 Mammal 執行個體Cat.prototype = new Mammal();// 擴充新原型對象,增加 purr 和 get_name 方法Cat.prototype.purr = function (n) {var i, s = '';for (i = 0; i < n; i += 1) {if (s) {s +- '-';}s += 'r';}return s;};Cat.prototype.get_name= function () {return this.says() + ' ' + this.name + ' ' + this.says();};var myCat = new Cat('Henrietta');var says = myCat.says(); // 'meow'var purr = myCat.purr(5); // 'r-r-r-r-r'var name = myCat.get_name(); // 'meow Henrietta meow'

使用構造器函數存在一個嚴重的危害。如果在調用構造器函數時忘記了在前面加上 new 首碼,那麼 this 將不會被綁定到一個新的對象上,而被綁定到全域對象上,所以不但沒有擴充新對象,反而破壞了全域變數。更噁心的是,發生了這樣情況時,既沒有編譯時間警告,也沒有運行時警告。
  這是一個嚴重的語言設計錯誤。為了降低這個問題帶來的風險,所有的構造器函數都約定命名成首字母大寫的形式,並且不以首字母大寫的形式拼字任何其他的東西。這樣可以通過目視檢查去發現是否缺少了 new 首碼。一個更好的備選方案就是根本不使用 new。
5.7、在一個純粹的原型模式中,會摒棄類而專註於對象。
5.8、使用函數模組模式的應用來解決繼承中父類屬性私人化的問題。

總結:
1、prototype 對象中有一個 constructor 屬性,它指向當前對象的一個引用。
2、一個不成文的約定,如果替換了prototype對象:
o.prototype = {};
那麼,下一步需要為新的 prototype 對象加上 constructor 屬性,並將這個屬性指回原來的建構函式。
o.prototype.constructor = o;
原因是前一步已經刪除了這個prototype對象原來的值,所以新的prototype對象沒有constructor屬性,所以我們必須手動加上去,否則後面的“繼承鏈”會出問題。

3、這一章個人感覺JavaScript中的繼承還是可以理解的,但讀起來特別費勁,收藏3篇不錯的進階文章《Javascript 物件導向編程(一):封裝》、《Javascript物件導向編程(二):建構函式的繼承》和《Javascript物件導向編程(三):非建構函式的繼承》。

轉載請註明出處:http://blog.csdn.net/xxd851116/article/details/7671802

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.