js設(shè)計模式及面向?qū)ο蟮母拍?/h1>

一坑律、工廠模式

概念:工廠方法說白了就是在工廠里面去寫方法速缨,在外部寫一個公用的方法去調(diào)取工廠的獨有方法娘香,來實現(xiàn)客戶的需求

可以批量創(chuàng)建相同屬性和方法的對象继阻,不用每次都重新定義對象

工廠模式需要3個基本步驟,原料投入(傳參)呐伞,加工過程(new—>return)敌卓,成品出廠(return)

 //工廠模式
    var a = {};//不能重復(fù)的利用  設(shè)置公共屬性的代碼
    // 我們需要創(chuàng)建10個cat屬性,每個對象都有 年齡姓名的屬性伶氢,包括run方法
    function createCat(age, name) {//工廠模式就是標(biāo)準(zhǔn)化的生成默認對象的函數(shù)
        var o = new Object();
        // var o={};
        o.age = age;
        o.name = name;
        o.run = function () {
            console.log(this.name + '  running....')
        }
        return o;
    }
    var c = createCat(19, 'hhh')
    var c2 = createCat(20, 'ggg')
    // 優(yōu)點:
    // 1趟径、可以進行批量的創(chuàng)建 都有公共的默認值和屬性對象,解決了重復(fù)創(chuàng)建對象的問題
    // 缺點
    // 1癣防、對象的方法不能重用蜗巧,每個對象的內(nèi)存都存儲一份函數(shù)對象的內(nèi)存
    // 2、不能識別對象的原型機構(gòu)造函數(shù)
    // 3蕾盯、c instance of  Cat;//false

2幕屹、構(gòu)造函數(shù)創(chuàng)建對象及優(yōu)缺點

優(yōu)點
所有創(chuàng)建出來的對象,都可以找到他的原型和構(gòu)造函數(shù)
公共的屬性和方法也可以在創(chuàng)建的時候統(tǒng)一創(chuàng)建和維護
缺點
對象的函數(shù),每個對象都會擁有一份內(nèi)存拷貝望拖。浪費內(nèi)存

 function Cat(name, age) {
        this.age = age
        this.name = name
        this.run = function () {
            console.log(this.name, this.age)
        }
    }
    var c1 = new Cat('black', 3);
    var c2 = new Cat('white', 2);

3渺尘、組合構(gòu)造函數(shù)模式與原型模式構(gòu)建對象

概念:組合使用構(gòu)造函數(shù)模式與原型模式
公共的屬性何方法放到原型上,獨立的屬性使用構(gòu)造函數(shù)模式说敏,放到對象自己身上
優(yōu)點:
既保證了方法等共享的屬性鸥跟,只在內(nèi)存中保存一份,節(jié)省內(nèi)存
又可以實現(xiàn)每個對象有自己單獨存放的屬性盔沫。是一種經(jīng)典的構(gòu)建對象的方法

function Cat() {
        this.age = 19
        // 如果需要共享的屬性和方法我們統(tǒng)一放到原型中定義
        // this.run = function () {
        //     console.log('fun')
        // }
    }
    Cat.prototype.name = 'black cat'
    Cat.prototype.run = function () {
        console.log(this.name, this.age)
    }
    var c1 = new Cat();
    var c2 = new Cat();
    console.log(c1.name)//black cat
    console.log(c2.name)//black cat
    // c1.run();
    console.log(c1.run() === c2.run())//true
    c1.name = 'white cat'
    console.log(c1.name);
image.png

4医咨、穩(wěn)妥構(gòu)造函數(shù)模式

概念:
所謂穩(wěn)妥對象,指的是沒有公共屬性架诞,而且其方法也不引用this的對象

優(yōu)點
可以共享屬性和方法的初始代碼
無論用戶是否用了new還是沒有使用new都會被正確的返回新的對象
缺點
無法追溯對象的原型和構(gòu)造函數(shù)拟淮,默認沒有公共的屬性和方法,內(nèi)存浪費

 function Cat() {
        var o = {};
        o.age = 10;
        o.name = 'black cat';
        o.run = function () {
            console.log(o.name + '  running....')
        }
        // 如果返回是引用類型就將他返回侈贷,如果是基本類型就返回this
        // o = { name: 'liu' };
        // o = 2;//2
        return o;
    }
    // new一個對象和不用new 是一樣的
    var c1 = new Cat()//構(gòu)造函數(shù)調(diào)用
    var c2 = Cat()//函數(shù)調(diào)用模式
    console.log(c1)
    console.log(c2)

5惩歉、對象的繼承

原型鏈繼承方式

// 動物基類
    function Animal(name, age) {
        this.name = name;
        this.age = age;
        this.fruit = ['water', 'apple']
    }
    // 在動物的基類上添加方法run
    Animal.prototype.run = function () {
        console.log(this.name + '  running')
    }

    function Cat(name, age) {
        this.name = name;
        this.age = age;
    }
    // 原型鏈的繼承方式
    // Cat.prototype.constructor === Cat
    // console.log(Cat.prototype.constructor === Cat)//true
    Cat.prototype = new Animal();
    //上面的代碼把cat的prototype指向了Animal 現(xiàn)在要還原回來
    Cat.prototype.constructor = Cat;
    console.log(Cat)
    console.log(Cat.prototype.constructor)//Animal
    var c = new Cat('Tom', 17)//希望cat繼承animal的屬性和方法
    c.run();//從animal原型上繼承的方法
    c.fruit.push('banana')
    console.log(c.fruit)//["water", "apple", "banana"]
    // 問題
    // 1、子類的構(gòu)造函數(shù)的參數(shù)俏蛮,沒法傳給父級的構(gòu)造函數(shù)
    // 2撑蚌、子類的原型的constructor會被改變,需要自己變回來
    // 3搏屑、如果父類里有引用類型的屬性争涌,那么所有的子類會共享這個引用類

構(gòu)造函數(shù)繼承

 // 父類
    function Animal(name, age) {
        this.name = name;
        this.age = age;
        this.fruit = ['water', 'apple']
    }
    // 在父類的原型上 創(chuàng)建run方法
    Animal.prototype.run = function () {
        console.log(this.name + '  running')
    }

    function Cat(name, age) {
        // Animal(age,name)//this===window; 
        Animal.call(this, name, age)//借用父類的構(gòu)造函數(shù) 給子類創(chuàng)建實例屬性
    }
    var c = new Cat('Tom', 12)
    console.dir(Cat.prototype.constructor)

    console.log(c)// Tom
    console.log(c.name)// Tom
    console.log(c.age)// Tom
    console.log(c.fruit)// ['water', 'apple']

組合繼承

 // 父類
    function Animal(name, age) {
        this.name = name;
        this.age = age;
        this.fruit = ['water', 'apple']
    }
    // 在父類的原型上 創(chuàng)建run方法
    Animal.prototype.run = function () {
        console.log(this.name + '  running')
    }

    function Cat(name, age) {
        // Animal(age,name)//this===window; 
        Animal.call(this, name, age)
    }
    Cat.prototype = new Animal();//組合原型繼承模式
    Cat.prototype.constructor = Cat;
    var c = new Cat('Tom', 12)
    console.dir(Cat.prototype.constructor)

    console.log(c)// Tom
    console.log(c.name)// Tom
    console.log(c.age)// Tom
    console.log(c.fruit)// ['water', 'apple']

原型方法繼承

    function object(o) {
        function F() { }
        F.prototype = o//讓空函數(shù)的原型指向o對象
        return new F();//創(chuàng)建一個f實例,f的內(nèi)部原型指向o對象
    }
    var o = { name: 'liu', age: 23 }
    var m1 = object(o)
    console.log(m1.name)
// 優(yōu)點:
// 不需要使用new構(gòu)造函數(shù)就可以直接 構(gòu)造另外其他對象
// 缺點:
// 所有構(gòu)造函數(shù)出來的實例會共享 原型對象上的引用類型的屬性

寄生繼承方式
寄生繼承模式是在原型式繼承模式上增強原型對象的增強模式辣恋。只是對象原型式繼承的擴張而已
寄生繼承類似一個工廠模式亮垫,工廠內(nèi)部把原型對象進行構(gòu)造出另一個實例,并對構(gòu)造出來的實例進行增強伟骨,最后返回這個實例

function Person(name, age, job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        alert(this.name);
    }
    return o;
}

var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

寄生組合的方式

image.png
image.png

區(qū)別地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末饮潦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子携狭,更是在濱河造成了極大的恐慌继蜡,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逛腿,死亡現(xiàn)場離奇詭異稀并,居然都是意外死亡,警方通過查閱死者的電腦和手機单默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門碘举,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搁廓,你說我怎么就攤上這事引颈「ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵线欲,是天一觀的道長明场。 經(jīng)常有香客問我,道長李丰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任逼泣,我火速辦了婚禮趴泌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拉庶。我一直安慰自己嗜憔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布氏仗。 她就那樣靜靜地躺著吉捶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皆尔。 梳的紋絲不亂的頭發(fā)上呐舔,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音慷蠕,去河邊找鬼珊拼。 笑死,一個胖子當(dāng)著我的面吹牛流炕,可吹牛的內(nèi)容都是我干的澎现。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼每辟,長吁一口氣:“原來是場噩夢啊……” “哼剑辫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渠欺,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤妹蔽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峻堰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讹开,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年捐名,在試婚紗的時候發(fā)現(xiàn)自己被綠了旦万。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡镶蹋,死狀恐怖成艘,靈堂內(nèi)的尸體忽然破棺而出赏半,到底是詐尸還是另有隱情,我是刑警寧澤淆两,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布断箫,位于F島的核電站,受9級特大地震影響秋冰,放射性物質(zhì)發(fā)生泄漏仲义。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一剑勾、第九天 我趴在偏房一處隱蔽的房頂上張望埃撵。 院中可真熱鬧,春花似錦虽另、人聲如沸暂刘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谣拣。三九已至,卻和暖如春族展,著一層夾襖步出監(jiān)牢的瞬間森缠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工苛谷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辅鲸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓腹殿,卻偏偏與公主長得像独悴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锣尉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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