成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端設(shè)計模式

jackzou / 3106人閱讀

摘要:當(dāng)一個對象的改變需要同時改變其他對象,而且他不知道具體有多少對象需要改變時,此時建議使用訂閱發(fā)布模式。指定發(fā)布者,類似于一個對象表示事件的名稱,是一個數(shù)組發(fā)布消息后,遍歷的數(shù)組,依次執(zhí)行訂閱者的回調(diào)函數(shù)。

1、模塊模式
在立即執(zhí)行函數(shù)表達(dá)式中定義的變量和方法,在該函數(shù)外部是訪問不到的,只能通過該函數(shù)提供的接口,"有限制的"進(jìn)行訪問;通過函數(shù)的作用域,解決了屬性和方法的封裝問題。
最常見的立即執(zhí)行函數(shù)寫法有以下兩種:

(function(){ /* code */ }())
或者
(function(){ /* code */ })()

模塊模式代碼:

    let Person = (function(){
        var age = "12";
        var name = "jerry";
        function getAge(){
            return age;
        }
        function getName(){
            return name;
        }
        return {
            getAge: getAge,
            getName: getName
        }
    })()
    console.log(age, "age"); // 報錯: Uncaught ReferenceError: age is not defined
    console.log(name, "name"); // 空字符串,為啥不報錯?看底部備注
    console.log(Person.age); // undefined
    console.log(Person.name); // undefined
    // 只能通過Person提供的接口訪問相應(yīng)的變量
    console.log(Person.getName()); // jerry
    console.log(Person.getAge()); // 12

2、構(gòu)造函數(shù)模式

    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.printName = function(){
        console.log(this.name)
    }
    Person.prototype.printAge = function(){
        console.log(this.age)
    }
    function Student(name,age){
        // 繼承 Person 的屬性
        Person.call(this,name,age)
    }
    function create(prototype){
        function F(){}
        F.prototype = prototype
        return new F()
    }
    // 讓Student的原型指向一個對象,該對象的原型指向了Person.prototype,通過這種方式繼承 Person 的方法
    Student.prototype = create(Person.prototype)
    Student.prototype.printAge = function(){
        console.log(this.age)
    }
    let student = new Student("jerry",12)
    student.printName() // "jerry"
    student.printAge() // "12"

3、混合模式

    function Person(name,age){
        this.name = name
        this.age = age
    }
    Person.prototype.printName = function(){
        console.log(this.name)
    }
    function Student(name,age){
        // 繼承 Person 的屬性
        Person.call(this, name, age)
    }
    function create(prototype){
        function F(){}
        F.prototype = prototype
        return new F()
    }
    // 讓Student的原型指向一個對象,該對象的原型指向了Person.prototype,通過這種方式繼承 Person 的方法
    Student.prototype = create(Person.prototype)
    Student.prototype.printAge = function(){
        console.log(this.age)
    }
    let student = new Student("jerry", 12)
    student.printName() // "jerry"
    student.printAge() // 12

4、工廠模式

    function Person(name, age){
        let person = new Object()
        person.name = name
        person.age = age
        person.printName = function(){
            console.log(this.name)
        }
        person.printAge = function(){
            console.log(this.age)
        }
        return person
    }
    let person = Person("jerry",12)
    person.printName()
    person.printAge()

5、單例模式

    let Singleton = (function(){
        let instantiated
        function init(){
            /*定義單例代碼*/
            return{
                publicMethod: function(){
                    console.log("Hello World");
                },
                publicProperty: "Test"
            }
        }
        return{
            getInstance: function(){
                if(!instantiated){
                    instantiated = init()
                }
                return instantiated
            }
        }
    }())
    Singleton.getInstance().publicMethod()

單例之間的通訊:
建立兩個獨(dú)立的對象:jim&&lily,兩者之間通過door直接通訊,如果沒有新建door,有直接通訊。代碼如下:

    let jim = (function(argument){
        let door
        let jimHome = function(msg){
            this.doorbell = msg
        }
        let info = {
            sendMessage: function(msg){
                if(!door){
                    door = new jimHome(msg)
                }
                return door
            },
            coming: function(){
                return "來了來了"
            }
        }
        return info
    }())
    let lily = {
        callJim: function(msg){
            let _xw = jim.sendMessage(msg)
            alert(_xw.doorbell)
            console.log(_xw.doorbell)
            _xw = null // 等待垃圾回收
            let coming = jim.coming()
            console.log(coming)
        }
    }
    lily.callJim("叮嚨")

6、發(fā)布-訂閱模式
訂閱發(fā)布模式定義了一種一對多的依賴關(guān)系,讓多個訂閱者對象同時監(jiān)聽某一個主題對象。這個主題對象在自身主題變化時,會通知所有訂閱者對象,使他們能夠自動更新自己的狀態(tài)。
將一個系統(tǒng)分割成一系列相互協(xié)作的類有一個很不好的副作用:需要維護(hù)相應(yīng)對象間的一致性,這樣會給維護(hù)、擴(kuò)展和重用都帶來不便。當(dāng)一個對象的改變需要同時改變其他對象,而且他不知道具體有多少對象需要改變時,此時建議使用訂閱發(fā)布模式。
應(yīng)用場景:
DOM事件。DOM事件是一種典型的發(fā)布-訂閱模式,對一個DOM節(jié)點(diǎn)的DOM事件進(jìn)行監(jiān)聽;當(dāng)操作DOM節(jié)點(diǎn)時,觸發(fā)相應(yīng)的事件并執(zhí)行函數(shù)。
自定義時間。指定發(fā)布者,類似于一個對象(key:value);key表示事件的名稱,value是一個數(shù)組;發(fā)布消息后,遍歷value的數(shù)組,依次執(zhí)行訂閱者的回調(diào)函數(shù)。
應(yīng)用Demo如下:

    let Event = (function(){
        var events = {}
        function on(evt, handler){
            events[evt] = events[evt]||[];
            events[evt].push({
                handler:handler
            })
        }
        function fire(evt,args){
            if(!events[evt]){
                return
            }
            for(var i=0;i

備注:console.log(name, "name")沒有報錯,是因為name是瀏覽器的窗口變量名,已存在于瀏覽器內(nèi)部。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101591.html

相關(guān)文章

  • 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 - 收藏集 - 掘金

    摘要:插件開發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實現(xiàn)文件分片斷點(diǎn)續(xù)傳。 Vue.js 插件開發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡單的方式。插....

    izhuhaodev 評論0 收藏0
  • 前端框架模式的變遷

    摘要:現(xiàn)在在前端的框架都是的模式,還有像和之類的變種獨(dú)特的單向數(shù)據(jù)流框架。只要將數(shù)據(jù)流進(jìn)行規(guī)范,那么原來的模式還是大有可為的。我們可以來看一下,框架的圖示從圖中,我們可以看到形成了一條到,再到,之后是的,一條單向數(shù)據(jù)流。 前言 前端框架的變遷,體系架構(gòu)的完善,使得我們只知道框架,卻不明白它背后的道理。我們應(yīng)該抱著一顆好奇心,在探索框架模式的變遷過程中,體會前人的一些理解和思考 本篇將講述的是...

    ssshooter 評論0 收藏0
  • 前端開發(fā)者手冊2019

    摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機(jī)和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學(xué)習(xí)到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...

    church 評論0 收藏0
  • 前端開發(fā)者手冊2019

    摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機(jī)和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學(xué)習(xí)到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...

    xiao7cn 評論0 收藏0
  • 前端開發(fā)者手冊2019

    摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機(jī)和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學(xué)習(xí)到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...

    鄒立鵬 評論0 收藏0

發(fā)表評論

0條評論

jackzou

|高級講師

TA的文章

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