摘要:推薦高級(jí)程序設(shè)計(jì),對(duì)類繼承有詳細(xì)介紹。書中涉及繼承方式多達(dá)數(shù)種,意味著繼承的靈活性。假設(shè)類和類不同公司有不同的公司信息,而同一公司內(nèi)的員工則需要繼承相同的公司信息。組合繼承組合繼承可以認(rèn)為是以上兩種組合實(shí)現(xiàn)。
前言
高級(jí)語(yǔ)言基本上都有類的概念,而javascript因?yàn)楦鞣N原因相對(duì)比較特別,并沒(méi)有明確的class類聲明方式(ES6暫不涉及),而是通過(guò)構(gòu)造函數(shù)變相實(shí)現(xiàn)。推薦《javascript高級(jí)程序設(shè)計(jì)》,對(duì)類繼承有詳細(xì)介紹。書中涉及繼承方式多達(dá)數(shù)種,意味著繼承的靈活性。但靈活性,有時(shí)也意味著復(fù)雜性??偨Y(jié)來(lái)說(shuō),繼承方案本文介紹兩種即可覆蓋大部分場(chǎng)景。
關(guān)于原型鏈關(guān)于原型鏈,花了很久才搞明白。javascript的世界,可以認(rèn)為變量皆對(duì)象。當(dāng)聲明一個(gè)普通變量,即可調(diào)用多種方法。
love = ["one", "two", "three"] ["one", "two", "three"] love.slice(1,2) ["two"] Object.keys(love) ["0", "1", "2"]
這里聲明一個(gè)數(shù)組,即可調(diào)用slice方法。既然未手工定義slice方法,為么能夠使用,就需要需要提到原型繼承。
對(duì)象可訪問(wèn)變量由兩部分構(gòu)成,屬性和原型對(duì)象。屬性優(yōu)先級(jí)高于原型對(duì)象,如上所述,love數(shù)組的屬性為"0", "1", "2",當(dāng)調(diào)用slice方法時(shí),會(huì)先在屬性里面尋找slice鍵對(duì)應(yīng)的值,此例中顯然不存在。未找到,則到原型對(duì)象中尋找。love變量的原型對(duì)象即為Array.prototype,鍵命中,所以不會(huì)undefined。注意的一點(diǎn),原型對(duì)象也是對(duì)象,即原型對(duì)象可能也存在原型對(duì)象,在原型對(duì)象中匹配鍵時(shí),也遵循先屬性,后原型的法則。這樣的匹配方式就實(shí)現(xiàn)了原型鏈。
屬性繼承某些場(chǎng)合中,不同類具備相同的屬性,而沒(méi)有需要共享的原型。舉例來(lái)說(shuō),基于Person類實(shí)現(xiàn)Female類。假設(shè)Person屬性為name,age;而Female類也需要有name,age屬性,但是多個(gè)sex屬性,既可以如下實(shí)現(xiàn):
function Person(name, age) { this.name = name; this.age = age; }; function Female(name, age) { this.name = name; this.age = age; this.sex = "female"; }; function Female(name, age) { Person.call(this, name, age); this.sex = "female"; };
兩種Female具備共有的屬性定義,主要功能是為了省代碼。從一定意義上來(lái)說(shuō),Female, Person處于同一層級(jí),并不符合繼承字面義。
原型繼承某些場(chǎng)合中,子類與超類需要共享信息,就需要原型繼承出場(chǎng)。假設(shè)organization類和employee類,不同公司有不同的公司信息,而同一公司內(nèi)的員工則需要繼承相同的公司信息。
function Organization(boss, belief) { this.boss = boss; this.belief = belief; }; function Employee(name, age) { this.name = name; this.age = age; };
讓不同的員工共享相同的公司信息可以如下實(shí)現(xiàn):
// first solution Employee.prototype = new Organization("bruce wayen", "make business easy"); Employee.prototype.constructor = Employee; // second solution Employee.prototype.boss = "bruce wayen"; Employee.prototype.belief = "make business easy";
值得注意的點(diǎn)在于,如果Organization不是某一超類的子類的話,兩種方式?jīng)]有任何差異。兩種prototype具備相同的三個(gè)屬性,且__proto__指針都指向Function.prototype。
如果Organization是Group的子類,那么第一種方式,
function Group() { this.label = "Group"; }; function Organization(boss, belief) { this.boss = boss; this.belief = belief; }; Organization.prototype = new Group(); Organization.prototype.constructor = Organization; function Employee(name) { this.name = name; }; Employee.prototype = new Organization("bruce wayen", "make business easy"); Employee.prototype.constructor = Employee;
Employee同時(shí)具備訪問(wèn)Group內(nèi)部變量的能力,此時(shí)原型對(duì)象__proto__指針指向Group.prototype。那么所有的employee.label即為Group。
從一定意義上來(lái)說(shuō),這種處理方式,Employee比Organization更高一級(jí),可訪問(wèn)變量出自身屬性外,還包含Organization可訪問(wèn)的所有鍵值,比較符合繼承的字面意。
組合繼承組合繼承可以認(rèn)為是以上兩種組合實(shí)現(xiàn)。組合繼承從一定程度上來(lái)說(shuō),就是類之間的深拷貝,兩者具有完全相同的原型對(duì)象,也存在一些共有的屬性,依舊拿Person, Female舉例:
function Person(name, age) { this.name = name; this.age = age; }; function Female(name, age) { Person.call(this, name, age); this.sex = "female"; }; Female.prototype = Person.prototype; Female.prototype.constructor = Female;
如果你使用Nodejs的話,會(huì)不會(huì)覺(jué)得Female的定義有點(diǎn)熟悉,看下面代碼:
var Orchestrator = require("orchestrator"); function Gulp() { Orchestrator.call(this); } util.inherits(Gulp, Orchestrator);
上面繼承屬性,下面繼承原型。
總結(jié)記錄比較零散,如有機(jī)會(huì),閱讀《javascript高級(jí)程序設(shè)計(jì)》可以收獲更多,暫且記錄到這里。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/87647.html
摘要:綜上所述有原型鏈繼承,構(gòu)造函數(shù)繼承經(jīng)典繼承,組合繼承,寄生繼承,寄生組合繼承五種方法,寄生組合式繼承,集寄生式繼承和組合繼承的優(yōu)點(diǎn)于一身是實(shí)現(xiàn)基于類型繼承的最有效方法。 一、前言 繼承是面向?qū)ο螅∣OP)語(yǔ)言中的一個(gè)最為人津津樂(lè)道的概念。許多面對(duì)對(duì)象(OOP)語(yǔ)言都支持兩種繼承方式::接口繼承 和 實(shí)現(xiàn)繼承 。 接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。由于js中方法沒(méi)有簽名...
摘要:如下示例構(gòu)造函數(shù)實(shí)例化對(duì)象新特性使用類實(shí)例化對(duì)象引入了類這一概念,可以通過(guò)關(guān)鍵字,定義類。否則報(bào)錯(cuò),這是類和構(gòu)造函數(shù)的一個(gè)主要區(qū)別。其實(shí),的類,可以看作是構(gòu)造函數(shù)的另外一種寫法。 前言 類語(yǔ)法是ES6中新增的一個(gè)亮點(diǎn)特性,下文簡(jiǎn)單對(duì)類的使用進(jìn)行簡(jiǎn)要說(shuō)明(僅作為個(gè)人層面的理解) js傳統(tǒng)模式實(shí)例化對(duì)象方法——prototype 在JavaScript中,實(shí)例化一個(gè)對(duì)象的傳統(tǒng)使用方法是通過(guò)...
摘要:坑當(dāng)然,也有可能會(huì)遇到踩坑的現(xiàn)象。與的關(guān)系至于與的關(guān)系,從繼承方面講可能為清晰很多??偨Y(jié)是節(jié)點(diǎn),其中包含不同類型的節(jié)點(diǎn),只是節(jié)點(diǎn)的一種。繼承與,可以調(diào)用的方法。 起因 起因有二: 在看winter老師的分享:《一個(gè)前端的自我修養(yǎng)》時(shí),有注意到這么一幅圖,里面有寫childNode和children屬性。showImg(https://segmentfault.com/img/remo...
摘要:重要方法在鏈尾添加元素除了這個(gè)方法以外,還提供了等一些方法,都是為實(shí)現(xiàn)和方法服務(wù)的,因?yàn)殡p向鏈表的原因,這些實(shí)現(xiàn)都很簡(jiǎn)單。 類聲明 LinkedList類聲明如下: public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Seria...
閱讀 1966·2023-04-26 02:46
閱讀 2062·2021-11-25 09:43
閱讀 1206·2021-09-29 09:35
閱讀 2163·2019-08-30 15:56
閱讀 3481·2019-08-30 15:54
閱讀 2711·2019-08-29 16:35
閱讀 3190·2019-08-29 15:25
閱讀 3355·2019-08-29 14:01