天天看點

Javascript原型繼承

     繼承機制一直是面向對象語言中最為人津津樂道的概念。在一邊的面向對象語言中(java),支援兩種繼承方式:接口繼承,實作繼承。

     javascript作為一種弱類型語言,其文法和設計,和面向對象語言有一定的差別,但就繼承來說,js實作繼承主要是依賴原型鍊實作的。其基本思想是利用原型鍊讓一個引用型繼承另一個引用類型的屬性和方法。

原型鍊

     我們知道每個構造函數(比如 function person(){....})都有一個原型對象(person prototype);

     每一個原型對象,都包含一個constructor指針,指向構造函數(person);

     而,每個執行個體都包含一個指向原型對象的内部指針([prototype],有些書和部落格叫_proto_)。

     知道上面的概念後,我們讓原型對象等于另一個類型的執行個體;那麼原型對象将包含一個指向另一個原型的指針,相應,讓另一個原型中也包含一個指向另一個構造函數的指針;如果我們讓另一個原型又是另一個類型的執行個體,那麼層層遞進,就構成了執行個體與原型之間的鍊式關系,就是所謂的“原型鍊”。

     比如像下圖一樣:

Javascript原型繼承

繼承

     js繼承的原理就是利用原型鍊,來通路其他對象的方法屬性。下面舉一個例子(javascript進階程式設計第三版第163頁);實作繼承的基本模式大緻如下:

function supertype() {

this.property = true;

};

supertype.prototype.getsupervalue = function() {

return this.property;

}

function subtype() {

this.subproperty = false;

//繼承

subtype.prototype = new supertype();

subtype.prototype.getsubvalue = function() {

return this.subproperty;

var instance = new subtype();

alert(instance.getsupervalue());//傳回true

    以上代碼代碼定義了兩個類型:supertype和subtype,以及每個類型的屬性和方法;

之後讓subtype.prototype = new supertype();實際上相當于重制原型對象,代之以supertype的一個執行個體;那麼原來存在于supertype執行個體中的所有方法和屬性;也存在于subtype.prototype中了;之後再給subtype.prototype新怎一個方法,相當于子類拓展自己的方法。上面例子中執行個體,構造函數,原型對象之間的關系如下圖所示。

Javascript原型繼承

    我們知道所有的引用類型預設都繼承了object,這個繼承夜市通過原型鍊實作的;是以上述圖檔的描述還少了一個環節;大家要記住,所有函數的預設原型都是object的執行個體,是以預設原型都會包含一個内部指針[prototype](也作_proto_),指向object.prototype。是以,我們自定義的類型調用的tostring(),valueof()方法,實際上來自于object.prototype。結合上面的例子,畫出了完整的原型鍊示意圖,如下所示:

Javascript原型繼承

繼續閱讀