JavaScript Mixin模式

Mixin模式,混合模式钾虐。這是一種不用繼承就可以復(fù)用的技術(shù)噪窘。主要還是為了解決多重繼承的問題。多繼承的繼承路徑是個問題效扫。
JS是基于對象的效览,類和對象都是對象模板。

混合mixin荡短,指的是將一個對象的全部或者部分拷貝到另一個對象上去丐枉。其實(shí)就是屬性了。
可以將多個類或?qū)ο蠡旌铣梢粋€類或?qū)ο蟆?/p>

繼承實(shí)現(xiàn)

先看一個繼承實(shí)現(xiàn)的例子

class Serialization {
    constructor() {
        console.log("Serialization construtor ~~~~~~")
        if (typeof(this.stringfy) !== "function") {
            throw new ReferenceError("should define stringify.");
        }
    }
}

class Point extends Serialization {
    constructor(x, y) {
        console.log("Point Constructor");
        super(); // 調(diào)用父構(gòu)造器
        this.x = x;
        this.y = y;
    }

    stringfy() {
        return `<Point x="${this.x}, y=${this.y}">`;
    }
}


s = new Serialization(); // 構(gòu)造Serialization失敗
p = new Point(4,5); // 構(gòu)造子類對象時掘托,調(diào)用父類構(gòu)造器執(zhí)行也會失敗

父類構(gòu)造函數(shù)中瘦锹,要求具有屬性是stringify的序列化函數(shù),如果沒有則拋出異常闪盔。

以下是完整繼承的代碼

class Serialization {
    constructor() {
        console.log("Serialization construtor ~~~~~~")
        if (typeof(this.stringfy) !== "function") {
            throw new ReferenceError("should define stringify.");
        }
    }
}

class Point extends Serialization {
    constructor(x, y) {
        console.log("Point Constructor");
        super(); // 調(diào)用父構(gòu)造器
        this.x = x;
        this.y = y;
    }

    stringfy() {
        return `<Point x="${this.x}, y=${this.y}">`;
    }
}

class Point3D extends Point {
    constructor(x, y, z) {
        super(x, y); // 調(diào)用父構(gòu)造器
        this.z = z;
    }

    stringfy() {
        return `<Point3D x="${this.x}, y=${this.y}, z=${this.z}">`
    }
}

p = new Point(4, 5);
console.log(p.stringfy());
console.log("=====================");
p3d = new Point3D(7, 8, 9);
console.log(p3d.stringfy());

/* 輸出結(jié)果
Point Constructor
Serialization construtor ~~~~~~
<Point x="4, y=5">
=====================
Point Constructor
Serialization construtor ~~~~~~
<Point3D x="7, y=8, z=9">
*/

高階對象實(shí)現(xiàn)

將類的繼承構(gòu)建成箭頭函數(shù)弯院。

const Serialization = Sup => class extends Sup{
    constructor(...args){
        console.log("Serialization constructor");
        super(...args);
        if (typeof this.stringfy !== "function"){
            throw ReferenceError("Stringfy is not define.");
        }
    }
};


class Point{
    constructor(x, y){
        console.log("Point sonctructor");
        this.x = x;
        this.y = y;
    }
}

class Point3D extends Serialization(Point){
    constructor(x, y, z){
        super(x, y);
        this.z = z;
    }
    stringfy(){
        console.log(`<Point ${this.x}.${this.y}.${this.z}>`)
    }
}

let p3d = new Point3D(3, 4, 5);
p3d.stringfy();

/* 輸出結(jié)果
Serialization constructor
Point sonctructor
<Point 3.4.5>
*/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泪掀,隨后出現(xiàn)的幾起案子听绳,更是在濱河造成了極大的恐慌,老刑警劉巖异赫,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椅挣,死亡現(xiàn)場離奇詭異头岔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鼠证,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門峡竣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人量九,你說我怎么就攤上這事适掰。” “怎么了荠列?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵类浪,是天一觀的道長。 經(jīng)常有香客問我肌似,道長戚宦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任锈嫩,我火速辦了婚禮受楼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呼寸。我一直安慰自己艳汽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布对雪。 她就那樣靜靜地躺著河狐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑟捣。 梳的紋絲不亂的頭發(fā)上馋艺,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音迈套,去河邊找鬼捐祠。 笑死,一個胖子當(dāng)著我的面吹牛桑李,可吹牛的內(nèi)容都是我干的踱蛀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼贵白,長吁一口氣:“原來是場噩夢啊……” “哼率拒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禁荒,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猬膨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呛伴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勃痴,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谒所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了召耘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐隆,死狀恐怖污它,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庶弃,我是刑警寧澤衫贬,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站歇攻,受9級特大地震影響固惯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缴守,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一葬毫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屡穗,春花似錦贴捡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至础废,卻和暖如春汛骂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背评腺。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工帘瞭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒿讥。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓图张,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诈悍。 傳聞我的和親對象是個殘疾皇子祸轮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計原則時需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上侥钳,這兩者...
    彥幀閱讀 3,748評論 0 14
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,128評論 0 21
  • 面向?qū)ο缶幊蹋∣OP) 在前面的章節(jié)中舷夺,我們學(xué)習(xí)了Kotlin的語言基礎(chǔ)知識苦酱、類型系統(tǒng)售貌、集合類以及泛型相關(guān)的知識。...
    Tenderness4閱讀 4,444評論 1 6
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,104評論 1 32
  • 13/21 晏云 貴陽 【每日一結(jié)構(gòu)】結(jié)構(gòu)思考力21天思維改善訓(xùn)練營 G:【4C】通過整理疫萤、整潔颂跨、清理、清潔資料室...
    晏云crack閱讀 104評論 0 0