一直以來對Javascript的繼承關係都是經過死記硬背下來的,對於一個理科生,喜歡邏輯思惟的人來說,死記硬背特別頭痛,且理科生對於可以死記硬背下來的東西也很容易忘記,不知道其餘理科生童鞋們是否如此,長時間發現,我是這樣的,喜歡邏輯性的東西, 不太喜歡死記硬背。最近看過篇文章《Javascript繼承機制的設計思想》(原文地址),javascript
原文寫的很好,當中講了Javascript的繼承產生思路。html
以下列舉一下表過程:java
1.1994年,網景公司(Netscape)發佈了Navigator瀏覽器0.9版,能夠瀏覽網頁了(無前段交互,無網頁互動)。編程
2.工程師Brendan Eich負責開發這種新語言(使得瀏覽器能夠與網頁互動的網頁頁腳本語言)瀏覽器
3.在其餘面向對象的語言的影響下,設計了繼承機制(爲了下降難度,沒有引入「類」的概念,使用了概念有:構造器constructor,new)編程語言
4.爲作好數據共享,增長了prototype。ide
說說繼承,爲了學習繼承,編寫了以下腳本函數
javascript中的數據繼承是經過_proto_ chain來實現的學習
javascript中繼承機制的實現:this
「JavaScript中的原型(prototype)是和函數(function)緊密相連的,由於每一個函數默認都會有一個屬性叫prototype, 每個經過函數和new操做符生成的對象都具備一個屬性__proto__, 這個屬性保存了建立它的構造函數的prototype屬性的引用。這個__proto__對象就是實現原型鏈的核心對象。JavaScript是一門面向對象的編程語言,它的繼承特性其實就是經過原型鏈機制來實現的。同時,instanceof運算符也須要在原型鏈的支持。」
寫了一段代碼以下:
<script> function Person(name){ this.name = namel; } alert(Person instanceof Object);//true //方式一 Person.prototype.species = "ABC"; Person.prototype.DoHardWork = function () { alert(this.species); } //方式二:兩種方式等價,但有區別 Person.prototype = { species: "ABC", DoHardWork: function () { alert(this.species) } };//至關於 Person.prototype = new Object({……});因此,Person.prototype.constructor === Object; Person.prototype.constructor = Person;//有利溯源查看Person這個原型, var father = new Person("張三");//father 中有 __propotype__屬性,指向了Person.prototype; var uncle = new person("張四"); var Son = function (name) { this.name = name; }; Son.prototype = father; son.prototype.constructor = Son; var son1 = new Son("張小三");//son1中__propotype__指向了father,father 中有 __propotype__屬性,指向了Person.prototype; /* 查看Son: son1.constructor; 查看Person:son1.constructor.prototype.constructor,//若是沒有 Person.prototype.constructor = Person;這句話,就不能獲取到Person 經過new生成的對象的Constructor找構造對象,經過構造對象(也是函數)獲取繼承的Prototype對象,經過Prototype對象的Constructor獲取原函數。 */ </script>