新聞中心
JavaScript不是純的面向?qū)ο蟮恼Z(yǔ)言,而是基于對(duì)象的語(yǔ)言,對(duì)象的繼承是以原型函數(shù)的形式繼承的,下面我們將主要介紹用JavaScript寫(xiě)出面向?qū)ο缶幊棠J降牡囊粋€(gè)小例子。

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、虛擬主機(jī)、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、延吉網(wǎng)站維護(hù)、網(wǎng)站推廣。
推薦閱讀:淺談JavaScript中面向?qū)ο蠹夹g(shù)的模擬
創(chuàng)建基類(lèi)
***個(gè)我們需要?jiǎng)?chuàng)建一個(gè)基類(lèi)來(lái)實(shí)例化操作。New后面的標(biāo)識(shí)符是對(duì)象的constructor,任意一個(gè)javascript類(lèi)都可以這樣創(chuàng)建這樣一個(gè)實(shí)例。舉個(gè)例子,下面的代碼創(chuàng)建了一個(gè)person類(lèi),然后實(shí)例化一個(gè)person對(duì)象。
- function Person(first, last) {
- this.first = first;
- this.last = last;
- }
- var person = new Person(“John”, “Dough”);
添加方法
如果你想在類(lèi)上添加方法來(lái)操作這個(gè)類(lèi)的實(shí)例,就像這樣,我們就可以通過(guò)創(chuàng)建”toString”方法去展示對(duì)象里的內(nèi)容。在我們的基類(lèi)上這樣實(shí)現(xiàn)。
- Person.prototype.toString = function() {
- return this.first + ” ” + this.last;
- };
- alert( person ); // displays “John Dough”
這證明了JavaScript語(yǔ)言的一個(gè)特性,“原型”。簡(jiǎn)單的說(shuō),所有JavaScript對(duì)象都有一個(gè)私有的原型屬性(_proto_)。這個(gè)”私有”意味著這個(gè)屬性不可見(jiàn)或者只有對(duì)象本身可以訪(fǎng)問(wèn)。當(dāng)對(duì)對(duì)象執(zhí)行查找某個(gè)屬性的時(shí)候,它首先查找實(shí)例里的是否存在這個(gè)屬性,如果沒(méi)有,就在對(duì)象的”私有”原型上查找。原型可以有他們自己的私有原型,所以查詢(xún)可以沿著原型鏈繼續(xù)執(zhí)行,直到找到屬性或者當(dāng)?shù)竭_(dá)空的私有原型里,依然沒(méi)有找到。
創(chuàng)建子類(lèi)
回到person對(duì)象,這個(gè)時(shí)候,我們需要添加更多的信息,讓這個(gè)person看起來(lái)像一個(gè)面試者。那么,我們這樣定義。
- KevLinDev.extend = function(subClass, baseClass) {
- function inheritance() {}
- inheritance.prototype = baseClass.prototype;
- subClass.prototype = new inheritance();
- subClasssubClass.prototype.constructor = subClass;
- subClass.baseConstructor = baseClass;
- subClass.superClass = baseClass.prototype;
- }
- function Employee(first, last, id) {
- // initialize properties here
- }
- KevLinDev.extend(Employee, Person);
我們先創(chuàng)建了一個(gè)比較方便的函數(shù)去設(shè)置我們的繼承鏈。我們需要讓baseclass的屬性和subclass的屬性對(duì)等。(記住,當(dāng)我們調(diào)用”new”的時(shí)候,原型屬性會(huì)被拷貝到一個(gè)實(shí)例的”_proto”中,這樣就把繼承鏈連接起來(lái))。然而,我們不能允許subClass和baseClass的原型都指向同一個(gè)對(duì)象??雌饋?lái)如果給baseClass添加方法,然后subClass也同時(shí)增加了這個(gè)方法,還是比較好的。
但是,如果給subClass添加方法,baseClass也會(huì)增加相應(yīng)的方法。顯然不是我們想要的處理方式。我們需要一種方式來(lái)斷開(kāi)兩個(gè)原型但是又允許subClass能繼承baseClass的方法。這個(gè)時(shí)候就需要原型鏈的幫忙了。
我們先要定義一個(gè)叫“inheritance”嵌套的函數(shù)。然后,我們把他的原型指向baseClass原型。這樣,任意一個(gè)新的“inheritance”實(shí)例都有他們自己的”_proto_”,指向基類(lèi)的原型。最終,我們創(chuàng)建一個(gè)“inheritance”實(shí)例,然后把它分配給subClass原型?,F(xiàn)在我們需要?jiǎng)?chuàng)建一個(gè)新的subClass實(shí)例,這個(gè)實(shí)例的”_proto_”將指向“inheritance”實(shí)例?!癷nheritance”實(shí)例的私有原型指向基類(lèi)的公共原型。
這樣,baseClass原型的改變會(huì)通過(guò)繼承鏈影響到subClass 的實(shí)例。因?yàn)槲覀優(yōu)閟ubclass的原型屬性創(chuàng)建了一個(gè)新的對(duì)象,我們可以添加到subclass的原型中而不影響基類(lèi)的原型。(小豪補(bǔ)充:因?yàn)槲覀儸F(xiàn)在創(chuàng)建的subClass的”_proto_”是指向“inheritance”實(shí)例。如果直接 subclass.prototype= baseClass.prototype;那么給子類(lèi)添加方法的同時(shí),基類(lèi)也會(huì)增加對(duì)應(yīng)的方法)
每次你創(chuàng)建一個(gè)新的對(duì)象實(shí)例,實(shí)例自身的構(gòu)造器會(huì)指向用來(lái)實(shí)例化的構(gòu)造器(
最終的兩行被當(dāng)作調(diào)用祖先構(gòu)造器和方法的方便屬性。在下一個(gè)部分就需要這樣的代碼了。
調(diào)用基類(lèi)
我們已經(jīng)定義了一個(gè)新的subclass,但是我們依舊需要去合適地初始化。理想狀態(tài)下,我們不應(yīng)該把代碼從person里復(fù)制到subclass,employee里。我們需要需找一個(gè)好點(diǎn)的方式去傳遞”first”和”last”參數(shù)到Person,讓employee自己處理id參數(shù)。下面就是實(shí)現(xiàn)方法:
- function Employee(first, last, id) {
- Employee.baseConstructor.call(this, first, last);
- this.id = id;
- this.add = function(){alert(“add success”)}
- }
- KevLinDev.extend(Employee, Person);
不可否認(rèn),這樣有點(diǎn)丑陋。然而,我們通過(guò)”call”調(diào)基類(lèi)方法。這個(gè)調(diào)用了基類(lèi)構(gòu)造器就像前面的”this”。剩余的參數(shù)傳遞到了調(diào)用的函數(shù)上。那么,既然這樣,基類(lèi)的構(gòu)造器person將執(zhí)行在”first”和”last”上的任一處理方法。Employee構(gòu)造器將處理“id”。
再建立一個(gè)子類(lèi)
我已經(jīng)發(fā)現(xiàn)已經(jīng)建造了一個(gè)oop模式去支持一級(jí)而不是兩級(jí)或者更多等級(jí)的繼承。讓我們?cè)賱?chuàng)建一個(gè)subclasses去確定我們的概念已經(jīng)合適成型。
- function Manager(first, last, id, department) {
- Manager.baseConstructor.call(this, first, last, id);
- this.department = department;
- }
- KevLinDev.extend(Manager, Employee);
沒(méi)其他新的東西,這個(gè)代碼看起來(lái)和我們的employee的定義差不多,也展示了繼承正在合理的工作。
原文鏈接:http://www.kevlindev.com/tutorials/javascript/inheritance/index.htm
本文標(biāo)題:JavaScript面向?qū)ο缶幊蹋涸屠^承實(shí)例
本文來(lái)源:http://www.dlmjj.cn/article/cddeogj.html


咨詢(xún)
建站咨詢(xún)
