亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Javascript類繼承淺析

Jochen / 2056人閱讀

摘要:推薦高級(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。

如果OrganizationGroup的子類,那么第一種方式,

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ō),這種處理方式,EmployeeOrganization更高一級(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

相關(guān)文章

  • JavaScript系列--淺析原型鏈與繼承

    摘要:綜上所述有原型鏈繼承,構(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)有簽名...

    draveness 評(píng)論0 收藏0
  • 淺析ES6新特性 —— Class

    摘要:如下示例構(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ò)...

    LiveVideoStack 評(píng)論0 收藏0
  • 淺析Node與Element

    摘要:坑當(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...

    U2FsdGVkX1x 評(píng)論0 收藏0
  • LinkedList源碼淺析

    摘要:重要方法在鏈尾添加元素除了這個(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...

    DC_er 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<