国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 設(shè)計(jì)模式

JayChen / 1994人閱讀

摘要:應(yīng)用場景一個的構(gòu)造函數(shù),提供創(chuàng)建不同類型汽車的方法。優(yōu)點(diǎn)保護(hù)全局命名空間免受污染,能很快地找到相應(yīng)的構(gòu)造函數(shù)。如果構(gòu)造函數(shù)不存在,報(bào)錯原型繼承父類,且只繼承一次迭代器模式定義按順序訪問一個聚合對象中各個元素。

1. 單例模式

定義:一個特定類 僅有一個實(shí)例

應(yīng)用場景: 一個遮罩層

實(shí)現(xiàn)方式

每個對象都是一個單體,因?yàn)樗麄兊囊梦恢貌灰粯樱?/p>

使用new操作符

將首次生成的對象存儲在全局變量中。缺點(diǎn):全局變量易被覆蓋。可以使用閉包來存儲這個變量,參見 一個遮罩層。

在構(gòu)造函數(shù)的屬性中存儲該實(shí)例。缺點(diǎn):構(gòu)造函數(shù)的屬性也容易被修改。

        function Universe() {
            if (typeof Universe.instance === "object") {
                return Universe.instance
            }

            this.start_time = 0;
            this.bang = "Big";

            Universe.instance = this;
        }

        var uni1 = new Universe();
        var uni2 = new Universe();

        console.log(uni1 === uni2); // true    
    - 重寫構(gòu)造函數(shù),使用閉包來儲存這個實(shí)例。缺點(diǎn):
//缺點(diǎn): 這種方式會丟掉初始實(shí)例與重寫構(gòu)造函數(shù)之間的關(guān)系,因此后面再向重寫的構(gòu)造函數(shù)原型中添加屬性時,并不會添加到初始實(shí)例中去。
        function Universe() {
            var instance = this;
            this.start_time = 0;
            this.bang = "Big";

            Universe = function Universe() {
                return instance;
            }
        }

        Universe.prototype.nothing = true;
        var uni1 = new Universe();

        Universe.prototype.everything = true;
        var uni2 = new Universe();

        console.log(uni1 === uni2); //true
        console.log(uni1.nothing); //true
        console.log(uni2.nothing); //true
        console.log(uni1.everything); //undefined
        console.log(uni2.everything); //undefined    
        console.log(uni1.constructor === Universe); //false

因此,我們需要先重寫構(gòu)造函數(shù)、保留原型屬性、生成實(shí)例,返回實(shí)例。

        function Universe() {
            var instance;
            
            Universe = function () {
                return instance;
            }

            Universe.prototype = this;

            instance = new Universe();
            instance.constructor = Universe;

            this.start_time = 0;
            this.bang = "big";

            return instance;
        }

        Universe.prototype.nothing = true;
        var uni1 = new Universe();

        Universe.prototype.everything = true;
        var uni2 = new Universe();

        console.log(uni1 === uni2); //true
        console.log(uni1.nothing); //true
        console.log(uni2.nothing); //true
        console.log(uni1.everything); //true
        console.log(uni2.everything); //true
        console.log(uni1.constructor === Universe); //true
- 還有一種就是使用即時函數(shù)
        var Universe;
        (function () {
            var instance;
            Universe =     function () {
                if (instance) {
                    return instance;
                }

                instance = this;
                this.start_time = 0;
                this.bang = "big";
            }
        })();

        Universe.prototype.nothing = true;
        var uni1 = new Universe();

        Universe.prototype.everything = true;
        var uni2 = new Universe();

        console.log(uni1 === uni2); //true
        console.log(uni1.nothing); //true
        console.log(uni2.nothing); //true
        console.log(uni1.everything); //true
        console.log(uni2.everything); //true
        console.log(uni1.constructor === Universe); //true    
2. 工廠模式

定義: 提供創(chuàng)建相似對象的可重用方法。在不確定的情況下,提前提供一種創(chuàng)建某類的方法。總-分模式。

應(yīng)用場景:一個CarMaker的構(gòu)造函數(shù),提供創(chuàng)建不同類型汽車的factory方法。

實(shí)現(xiàn)方式。優(yōu)點(diǎn):保護(hù)全局命名空間免受污染,能很快地找到相應(yīng)的構(gòu)造函數(shù)。

        function CarMaker() {}
        
        CarMaker.prototype.getPrice =     function () {
            console.log("Price:", this.price);
        }

        CarMaker.factory = function (type) {
            var newcar;
            //如果構(gòu)造函數(shù)不存在,報(bào)錯
            if (typeof CarMaker[type] !== "function") {
                throw {
                    name: "Error",
                    message: type + " dosen"t exist"
                }
            }

            //原型繼承父類,且只繼承一次
            if (typeof CarMaker[type].prototype.getPrice !== "function") {
                CarMaker[type].prototype = new CarMaker();
            }

            newcar = new CarMaker[type]();
            return newcar;
        }

        CarMaker.SUV = function () {
            this.price = 100;
        }

        CarMaker.Compat = function () {
            this.price = 50;
        }

        var a = CarMaker.factory("SUV");
        var b = CarMaker.factory("Compat");

        a.getPrice(); //Price: 100
        b.getPrice(); //Price: 100
3. 迭代器模式

定義:按順序訪問一個聚合對象中各個元素。通常包含next(獲取下一個元素), hasNext(是否到末尾),rewind(重置初始位置), current(當(dāng)前元素)集中方法。

應(yīng)用場景:需要按照順序,以不同的間隔獲取集合中的元素。

實(shí)現(xiàn)方法:

function iterator (data = [], gap = 1) {
         var index = 0, //記錄當(dāng)前位置
                 length = data.length; //數(shù)據(jù)總長度
         return {
             next() {
                 var element;
                 if (!this.hasNext()) {
                     return null;
                 }
                 element = data[index];
                 index += gap;
                 return element;
             },
             hasNext() {
                 return index < length;
             },
             rewind() {
                 index = 0;
             },
             current() {
                 return data[index];
             }
         }
     }

     var arrIterator = iterator([1, 2, 3, 4, 5]);

     while(arrIterator.hasNext()) {
         console.log(arrIterator.next());
     }

     arrIterator.rewind();
     console.log(arrIterator.current());
4. 裝飾者模式

定義: 在運(yùn)行時動態(tài)添加附加功能到對象中。

應(yīng)用場景:購買某種東西時,隨著添加不同的裝備,價(jià)格也不一樣。最后需要根據(jù)添加的設(shè)備計(jì)算總價(jià)。

實(shí)現(xiàn)方法:要注意的是,各裝飾器需要提供原型方法的接口。 另一種實(shí)現(xiàn)方式

        function Sale(price = 100) {
            this.price = price;
            this.decorators_list = [];
        }

        //裝飾器
        Sale.decorators = {};
        Sale.decorators.pack = {
            getPrice(price) {
                return price + 20;
            }
        }
        Sale.decorators.mail = {
            getPrice(price) {
                return price + 10;
            }
        }

        Sale.prototype.decorate = function (decorator) {
            this.decorators_list.push(decorator);
        }

        Sale.prototype.getPrice = function () {
            let price = this.price;
            //調(diào)用各裝飾器的接口
            for (let i = 0, len = this.decorators_list.length; i < len; i++) {
                name = this.decorators_list[i];
                price = Sale.decorators[name].getPrice(price);
            }
            return price;
        }

        var sale = new Sale();
        sale.decorate("pack");
        sale.decorate("mail");
        console.log(sale.getPrice()); //130
5. 策略者模式

定義:在運(yùn)行時可以選擇算法。

應(yīng)用場景:表單驗(yàn)證。

實(shí)現(xiàn)方式:一個含有config(配置驗(yàn)證規(guī)則), types(驗(yàn)證類型), validate(驗(yàn)證方法), message(結(jié)果消息數(shù)組), hasErrors(最后結(jié)構(gòu))幾個屬性的validator對象。

6. 外觀模式

定義:提供一個高級接口,調(diào)用經(jīng)常需要同時使用的幾個基礎(chǔ)方法。

應(yīng)用場景:將stopPropagationpeventDefault包裝在stop這個高級接口中。

飯?zhí)玫某床藥煾挡粫驗(yàn)槟泐A(yù)定了一份燒鴨和一份白菜就把這兩樣菜炒在一個鍋里。他更愿意給你提供一個燒鴨飯?zhí)撞汀M瑯釉诔绦蛟O(shè)計(jì)中,我們需要保證函數(shù)或者對象盡可能的處在一個合理粒度,畢竟不是每個人喜歡吃燒鴨的同時又剛好喜歡吃白菜。

外觀模式還有一個好處是可以對用戶隱藏真正的實(shí)現(xiàn)細(xì)節(jié),用戶只關(guān)心最高層的接口。比如在燒鴨飯?zhí)撞偷墓适轮校悴⒉魂P(guān)心師傅是先做燒鴨還是先炒白菜,你也不關(guān)心那只鴨子是在哪里成長的。

7. 代理模式

定義:介于對象和對象的客戶端之間,對對象本體起保護(hù)作用,使本體對象做盡可能少的工作。目的是解決性能問題。

應(yīng)用場景:

初始化本體對象消耗非常大,但是在初始化該對象的之后并未使用。此時可使用代理模式,接收初始化請求,返回ok,等真正用到本體對象時再初始化。

發(fā)起Http請求會消耗性能,最好的方法就是使用代理合并Http請求,比如將50ms內(nèi)的發(fā)起的請求合并為一個請求。

為了減少性能消耗,還可給代理設(shè)置一個緩存,緩存結(jié)果。

fragment應(yīng)該就算一個代理模式吧,緩存了對DOM的操作。

實(shí)現(xiàn)方法:對象客戶端調(diào)用代理提供的方法,代理對客戶端的請求進(jìn)行處理后調(diào)用對象本體方法。

8. 中介者模式

定義:一個程序中有很多對象,這些對象之間會相互通信。但是如果修改其中一個對象,則必然會牽涉到其他和他通信的對象,造成緊耦合。中介者模式就是提出一個中間對象來實(shí)現(xiàn)對象間的松耦合通信。通信的對象不用知道對方是誰,只要有變動就通知給這個中介者,中介者知道所有的對象并且負(fù)責(zé)聯(lián)系相應(yīng)的對象做出處理。

應(yīng)用場景:MVC中的Controller

實(shí)現(xiàn)方法:http://www.jspatterns.com/boo...

9. 觀察者模式

定義:該模式的目的也是為了形成松耦合。對象之間不直接調(diào)用彼此的方法,而是采取訂閱的模式,訂閱者訂閱發(fā)布者的事件,并向發(fā)布者提供一個事件發(fā)生時調(diào)用的方法。中介者模式中的mediator需要知道所有其他對象,而該模式并不需要知道,只要訂閱事件即可。

應(yīng)用場景:DOM中的事件。

實(shí)現(xiàn)方法:
發(fā)布者需要:訂閱者的列表{type: []},訂閱方法, 取消訂閱,發(fā)布消息幾種方法。http://www.jspatterns.com/boo...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86910.html

相關(guān)文章

  • JS程序

    摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評論0 收藏0
  • 2017年 最好的javascript 書籍

    摘要:請記住,這些書中的一些可能不是最新的,但概念和基礎(chǔ)仍應(yīng)適用。是最好的老師之一。的秘密由部分組成。在你完成這些書后,查看書籍和最好的本土?xí)? 我看過三本,第1本,第二本,第四本。第一本買的的實(shí)體書,其他兩本看的是電子書。第一本是大名鼎鼎老道寫的,書很薄,但是非常經(jīng)典。javascirpt忍者秘籍是jquery的作者寫的,也是非常經(jīng)典。you dont kown js系列也是非常好。看了...

    mingzhong 評論0 收藏0
  • 前端練級攻略(第二部分)

    摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個實(shí)踐的重點(diǎn)是把你在前端練級攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級攻略 第二部分,第一部分請看下面: 前端練級攻略(第一部分) 在第二部分,我們將重點(diǎn)學(xué)習(xí) JavaScript 作為一種獨(dú)立的語言,如...

    BWrong 評論0 收藏0
  • 理解JavaScript的核心知識點(diǎn):原型

    摘要:首先,需要來理清一些基礎(chǔ)的計(jì)算機(jī)編程概念編程哲學(xué)與設(shè)計(jì)模式計(jì)算機(jī)編程理念源自于對現(xiàn)實(shí)抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過程式和函數(shù)式編程。 JavaScript 中的原型機(jī)制一直以來都被眾多開發(fā)者(包括本人)低估甚至忽視了,這是因?yàn)榻^大多數(shù)人沒有想要深刻理解這個機(jī)制的內(nèi)涵,以及越來越多的開發(fā)者缺乏計(jì)算機(jī)編程相關(guān)的基礎(chǔ)知識。對于這樣的開發(fā)者來說 J...

    iKcamp 評論0 收藏0
  • JavaScript系列(四) - 收藏集 - 掘金

    摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗?dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導(dǎo)范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。因此,...

    cfanr 評論0 收藏0
  • JavaScript進(jìn)階之路

    摘要:前端入門的門檻相對較低,學(xué)習(xí)曲線是越來越陡峭,由淺入深,可以分為四個階段。第二階段高級程序設(shè)計(jì)有的書是用來成為經(jīng)典的,比如犀牛書還有些書是用來超越經(jīng)典的,顯然這本書就是。接下來可以看看教程,看看源代碼,嘗試著寫一寫這些效果。 前端入門的門檻相對較低,學(xué)習(xí)曲線是越來越陡峭,由淺入深,可以分為四個階段。 第一階段:《JavaScript DOM編程藝術(shù)》    看這本書之前,請先確認(rèn)你對J...

    Lowky 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<