摘 要:本文主要介紹JavaScript中基于原型的繼承的實現(xiàn)方式,通過實例的說明,增強讀者對基于類的繼承和基于原型的繼承的理解,同時分析了基于原型的繼承模式的利弊。
關(guān)鍵詞:JavaScript;基于原型的繼承;基于類的繼承
中圖分類號:TP391
隨著Node.js的誕生,JavaScript已經(jīng)不僅僅是一門編程語言,其在客戶端和服務(wù)器端的雙重主導(dǎo)地位,使得“一切皆為JavaScript”成為一種必然趨勢。近年來,JavaScript已經(jīng)從一門簡單的腳本語言進化成為一門強大的編程語言。
根據(jù)多年來的教學(xué)經(jīng)驗,JavaScript是一種既簡單又難以掌握的語言。而其難點之一,就在于對其原型對象及其繼承機制的理解。
1 基于類的繼承和基于原型的繼承
首先,現(xiàn)在廣為流傳的面向?qū)ο蟮木幊陶Z言,例如:Java,是基于類的語言。在基于類的語言中,對象是類的實例,并且可以從另一個類繼承。而在基于類的語言中,繼承的好處主要有兩點。
1.1 代碼重用性高。如果我們新創(chuàng)建的類與已有的類有絕大部分相類似,則沒有必要再重新定義這個完整的類。最好的方式,就是只說明新創(chuàng)建的類與已有的類之間的不同之處。而繼承,正好實現(xiàn)了代碼的重用,大大減少了軟件開發(fā)的成本。
1.2 繼承引入了一套類型系統(tǒng)的規(guī)范。這樣使得程序員可以將子類的對象直接賦值給父類的引用,無需再編寫顯式的類型轉(zhuǎn)化。既減輕了工作量又保證了類型系統(tǒng)在安全上的優(yōu)勢。
而對于JavaScript這種弱類型語言來說,我們不需要考慮類型轉(zhuǎn)化問題,對象繼承關(guān)系更關(guān)注于這個對象能做什么而不是它從哪里來。為此JavaScript提供了一套更為豐富的代碼重用模式。JavaScript是一門基于原型的語言,所以對象可以直接從其它對象繼承而來。
2 原型對象的理解
在認識原型對象之前,我們還應(yīng)該理解一下基于類的語言和基于原型的語言對于類,對象,實例定義的差別。在基于類的語言中,程序員需要單獨對類進行定義,并且通過構(gòu)造器來創(chuàng)建該類的實例,可以使用new操作符來實現(xiàn)創(chuàng)建類的實例。在JavaScript中也有著相類似的模式,與Java不同的是,JavaScript沒有類定義和特殊的構(gòu)造器定義。需要程序員自己定義一個構(gòu)造函數(shù)來創(chuàng)建屬性,而所有的函數(shù)都可以被用來定義構(gòu)造函數(shù)。所謂實例,對于基于類的語言來說,一個實例就是一個類的個體成員,而類本身只是對對象屬性和行為的一種抽象定義。在JavaScript中,實例和類則沒有這樣的本質(zhì)區(qū)別,實例可以看做是對象。
了解到了JavaScript對于對象的定義,接下來我們來理解一下原型對象的概念。在JavaScript中,只要創(chuàng)建一個新函數(shù),就會根據(jù)一組特定規(guī)則為該函數(shù)創(chuàng)建一個prototype屬性,而這個屬性指向函數(shù)的原型對象。在默認情況下原型對象會自動獲得一個constructor屬性,而這個屬性包含一個指向prototype屬性所在函數(shù)對象的指針。
當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個新實例后,該實例所包含的一個指針指向構(gòu)造函數(shù)的原型對象。而在ECMA-262第5版中,這個指針叫做[[prototype]]。下面我們用Employee這個例子,簡單說明一下構(gòu)造函數(shù),原型函數(shù)以及新創(chuàng)建的實例的實現(xiàn)以及在內(nèi)存中的關(guān)系。
inherit()函數(shù)的實現(xiàn)就是對原型式模式的應(yīng)用,它可以防止庫函數(shù)對那些不受控制的對象的意外修改。原型式模式傳入的是引用類型值,所以也存在共享屬性的問題,如組合模式一樣,也可以用構(gòu)造函數(shù)的類似方式解決這一問題。
參考文獻:
[1]Crockford D.JavaScript語言精粹[M].北京:電子工業(yè)出版社,2009.
[2]Flanagan D.JavaScript權(quán)威指南(第六版)[M].北京:中國電力出版社,2001.
[3]Nicholas C.Zakas JavaScript高級程序設(shè)計(第三版)[M].北京:人民郵電出版社,2012.
作者簡介:王貫飛(1966.04-),女,副教授,本科,主要從事計算機多媒體、Flash動畫編程、多媒體課件制作。
作者單位:遼寧輕工職業(yè)學(xué)院,遼寧大連 116100