最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript設(shè)計模式之工廠模式和構(gòu)造器模式

 更新時間:2015年02月11日 09:17:03   投稿:junjie  
這篇文章主要介紹了JavaScript設(shè)計模式之工廠模式和構(gòu)造器模式,本文同時講解了設(shè)計模式的類別如創(chuàng)建型設(shè)計模式、結(jié)構(gòu)型設(shè)計模式、行為設(shè)計模式等內(nèi)容,需要的朋友可以參考下

什么是模式

前陣子準(zhǔn)備期末考試,勞神又傷身的,實在閑不得空來更新文章,今天和大家說說javascript中的設(shè)計模式。

首先呢,我們需要知道的是:模式是一種可復(fù)用的解決方案,而反模式呢就是針對某個問題的不良解決方案。

js反模式常見例子

1.向setTimeout和setInterval傳遞字符串,而不是函數(shù),這會觸發(fā)eval()的內(nèi)部使用。
2.在全局上下文中定義大量的變量污染全局命名空間
3.修改Object類的原型
4.以內(nèi)聯(lián)形式使用js,嵌入在HTML文件中的js代碼是無法包含在外部單元測試工具中的。
5.濫用document.write,如果在頁面加載完成后執(zhí)行docume.write,它會重寫我們所在的頁面,可以使用document.creatElement代替的話就盡量不用docume.write。

設(shè)計模式的類別

創(chuàng)建型設(shè)計模式

創(chuàng)建型設(shè)計模式專注于處理對象創(chuàng)建機制,以適合給定情況的方式來創(chuàng)建對象。屬于這個類別的屬性包括:

Constructor構(gòu)造器、Factory工廠、Abstract抽象、Prototype原型、Singleton單例和Builder生成器

結(jié)構(gòu)型設(shè)計模式

結(jié)構(gòu)型模式與對象組合有關(guān),通??梢杂糜谡页鲈诓煌瑢ο笾g建立關(guān)系的簡單方法。
屬于這個類別的模式包括:

Decorator裝飾者、Facade外觀、Flyweight享元、Adapter適配器和Proxy代理

行為設(shè)計模式

行為模式專注于改善或簡化系統(tǒng)中不同對象之間的通信。

行為模式包括:

Iterator迭代器、Mediator中介者、Observer觀察者和Visitor訪問者

Factory(工廠)模式

為了解決多個類似對象聲明的問題,我們可以使用一種叫做 工廠模式的方法,這種方法 就是為了解決實例化對象產(chǎn)生大量重復(fù)的問題。

復(fù)制代碼 代碼如下:

<script type="text/javascript">
    function createObject(name,age,profession){//集中實例化的函數(shù)
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.profession = profession;
        obj.move = function () {
            return this.name + ' at ' + this.age + ' engaged in ' + this.profession;
        };
        return obj;
    }
    var test1 = createObject('trigkit4',22,'programmer');//第一個實例
    var test2 = createObject('mike',25,'engineer');//第二個實例
    alert(test1.move());
    alert(test2.move());
</script>

工廠模式的分類

工廠模式分為簡單工廠、抽象工廠和智能工廠,工廠模式不顯示地要求使用一個構(gòu)造函數(shù)。

簡單工廠模式:使用一個類(通常為單體)來生成實例。
復(fù)雜工廠模式:使用子類來決定一個成員變量應(yīng)該是哪個具體的類的實例。

工廠模式之利

主要好處就是可以消除對象間的耦合,通過使用工程方法而不是new關(guān)鍵字。將所有實例化的代碼集中在一個位置防止代碼重復(fù)。
工廠模式之弊

大多數(shù)類最好使用new關(guān)鍵字和構(gòu)造函數(shù),可以讓代碼更加簡單易讀。而不必去查看工廠方法來知道。   
工廠模式解決了重復(fù)實例化的問題 ,但還有一個問題,那就是識別問題,因為根本無法 搞清楚他們到底是哪個對象的實例。

復(fù)制代碼 代碼如下:

alert(typeof test1); //Object
alert(test1 instanceof Object); //true

何時使用工廠模式?

Factory模式主要在以下場景使用:

1.當(dāng)對象或組件涉及高復(fù)雜性時
2.當(dāng)需要根據(jù)所在的不同環(huán)境輕松生成對象的不同實例時
3.當(dāng)處理很多共享相同屬性的小型對象或組件時

Constructor(構(gòu)造器)模式

ECMAScript 中可以采用構(gòu)造函數(shù)(構(gòu)造方法)可用來創(chuàng)建特定的對象。 該模式正好可以解決以上的工廠模式無法識別對象實例的問題。

復(fù)制代碼 代碼如下:

<script type="text/javascript">
    function Car(model,year,miles){//構(gòu)造函數(shù)模式
        this.model = model;
        this.year = year;
        this.miles = miles;
        this.run = function () {
            return this.model + " has done " + this.miles + "miles";
        }
    }
    var Benz = new Car('Benz',2014,20000);
    var BMW = new Car("BMW",2013,12000);
    alert(Benz instanceof Car); //很清晰的識別他從屬于 Car,true

    console.log(Benz.run());
    console.log(BMW.run());
</script>

使用構(gòu)造函數(shù)的方法 ,即解決了重復(fù)實例化的問題 ,又解決了對象識別的問題,該模式與工廠模式的不同之處在于:

1.構(gòu)造函數(shù)方法沒有顯示的創(chuàng)建對象 (new Object());
2.直接將屬性和方法賦值給 this 對象;
3.沒有 renturn 語句。

構(gòu)造函數(shù)的方法有一些規(guī)范:

1.函數(shù)名和實例化構(gòu)造名相同且大寫, (PS:非強制,但這么寫有助于區(qū)分構(gòu)造函數(shù)和 普通函數(shù));
2.通過構(gòu)造函數(shù)創(chuàng)建對象,必須使用 new 運算符。 
既然通過構(gòu)造函數(shù)可以創(chuàng)建對象,那么這個對象是哪里來的, new Object()在什么地方執(zhí)行了?執(zhí)行的過程如下:

1.當(dāng)使用了構(gòu)造函數(shù),并且 new 構(gòu)造函數(shù)(),那么就后臺執(zhí)行了 new Object();
2.將構(gòu)造函數(shù)的作用域給新對象 ,(即 new Object()創(chuàng)建出的對象),而函數(shù)體內(nèi)的 this 就 代表 new Object()出來的對象。
3.執(zhí)行構(gòu)造函數(shù)內(nèi)的代碼;
4.返回新對象(后臺直接返回)。

帶原型的Constructor(構(gòu)造器)

js中有一個名為prototype的屬性。調(diào)用js構(gòu)造器創(chuàng)建一個對象后,新對象就會具有構(gòu)造器原型的所有屬性。通過這種方式,可以創(chuàng)建多個Car對象,并訪問相同的原型。

復(fù)制代碼 代碼如下:

   <script type="text/javascript">
        function Car(model,year,miles) {
            this.model = model;
            this.year = year;
            this.miles = miles;
        }
        Car.prototype.run = function () {
            return this.model + " has done " + this.miles + " miles ";

        };
        var Benz = new Car('S350',2010,20000);
        var Ford = new Car('Ford',2012,12000);

        console.log(Benz.run());//"S350 has done 20000 miles "
        console.log(Ford.run());
    </script>


現(xiàn)在run()的單一實例就能夠在所有Car對象之間共享。

相關(guān)文章

  • js點擊任意區(qū)域彈出層消失實現(xiàn)代碼

    js點擊任意區(qū)域彈出層消失實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了js點擊任意區(qū)域彈出層消失實現(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JavaScript禁止右擊保存圖片,禁止拖拽圖片的實現(xiàn)代碼

    JavaScript禁止右擊保存圖片,禁止拖拽圖片的實現(xiàn)代碼

    這篇文章主要介紹了JavaScript禁止右擊保存圖片,禁止拖拽圖片的實現(xiàn)代碼,代碼簡單易懂,非常不錯,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • js判斷瀏覽器類型為ie6時不執(zhí)行

    js判斷瀏覽器類型為ie6時不執(zhí)行

    這篇文章主要介紹了js怎么判斷瀏覽器類型,當(dāng)類型為ie6時如何不執(zhí)行,需要的朋友可以參考下
    2014-06-06
  • JavaScript高級函數(shù)應(yīng)用之分時函數(shù)實例分析

    JavaScript高級函數(shù)應(yīng)用之分時函數(shù)實例分析

    這篇文章主要介紹了JavaScript高級函數(shù)應(yīng)用之分時函數(shù),結(jié)合實例形式分析了javascript通過合理分時函數(shù)應(yīng)用避免瀏覽器卡頓或假死的相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • 一篇文章帶你吃透JavaScript中的DOM知識及用法

    一篇文章帶你吃透JavaScript中的DOM知識及用法

    DOM作用:用來修改網(wǎng)頁內(nèi)容,結(jié)構(gòu)和樣式,下面這篇文章主要給大家介紹了關(guān)于如何通過一篇文章帶你吃透JavaScript中的DOM知識及用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • js實現(xiàn)簡單的日歷顯示效果函數(shù)示例

    js實現(xiàn)簡單的日歷顯示效果函數(shù)示例

    這篇文章主要介紹了js實現(xiàn)簡單的日歷顯示效果函數(shù),結(jié)合完整實例形式分析了JavaScript實現(xiàn)的日歷功能相關(guān)原理與具體操作技巧,需要的朋友可以參考下
    2019-11-11
  • js實現(xiàn)盒子移動動畫效果

    js實現(xiàn)盒子移動動畫效果

    這篇文章主要為大家詳細介紹了js實現(xiàn)盒子移動動畫效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JavaScript繼承模式粗探

    JavaScript繼承模式粗探

    之前提到了JS中比較簡單的設(shè)計模式,在各種設(shè)計模式中被最常使用的工具之一就是原型鏈的繼承。作為OOP的特質(zhì)之一——繼承,今天主要談?wù)凧S中比較簡單的繼承方法
    2016-01-01
  • 原生JS實現(xiàn)多條件篩選

    原生JS實現(xiàn)多條件篩選

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)多條件篩選,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • javascript實現(xiàn)密碼驗證

    javascript實現(xiàn)密碼驗證

    這篇文章主要介紹了javascript密碼驗證的實現(xiàn)方法,過程很簡單具有一定的參考價值,適合初學(xué)者學(xué)習(xí)研究,感興趣的小伙伴們可以參考一下
    2015-11-11

最新評論

连山| 湘乡市| 普陀区| 乌拉特前旗| 临湘市| 桦甸市| 西华县| 将乐县| 兴业县| 青神县| 班玛县| 湾仔区| 汾阳市| 壶关县| 凤山市| 高阳县| 宁强县| 新兴县| 六枝特区| 鄂托克旗| 项城市| 玉山县| 济阳县| 和林格尔县| 厦门市| 盖州市| 武功县| 元阳县| 绍兴县| 台北市| 项城市| 锦屏县| 嘉鱼县| 深水埗区| 龙州县| 石城县| 望奎县| 尼勒克县| 江孜县| 科尔| 苏州市|