<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # js設計模式 **開始!** 在程序中,大部分語言的實現都是基于“類”。 在js中并沒有類這個概念,js中的函數屬于對象,而基于js中閉包與弱類型等特性,在實現一些設計模式的方式上與眾不同。 ## 設計原則 **單一職責原則(SRP)** 一個對象或方法只做一件事情。如果一個方法承擔了過多的職責,那么在需求的變遷過程中,需要改寫這個方法的可能性就越大。 應該把對象或方法劃分成較小的粒度 **最少知識原則(LKP)** 一個軟件實體應當 盡可能少地與其他實體發生相互作用? 應當盡量減少對象之間的交互。如果兩個對象之間不必彼此直接通信,那么這兩個對象就不要發生直接的 相互聯系,可以轉交給第三方進行處理 **開放-封閉原則(OCP)** 軟件實體(類、模塊、函數)等應該是可以 擴展的,但是不可修改 當需要改變一個程序的功能或者給這個程序增加新功能的時候,可以使用增加代碼的方式,盡量避免改動程序的源代碼,防止影響原系統的穩定 ## 什么是設計模式? >假設有一個空房間,我們要日復一日地往里面放一些東西。最簡單的辦法當然是把這些東西 直接扔進去,但是時間久了,就會發現很難從這 個房子里找到自己想要的東西,要調整某幾樣東 西的位置也不容易。所以在房間里做一些柜子也 許是個更好的選擇,雖然柜子會增加我們的成 本,但它可以在維護階段為我們帶來好處。使用 這些柜子存放東西的規則,或許就是一種模式 —— [《JavaScript設計模式與開發實踐》](https://book.douban.com/subject/26382780/) 學習設計模式,有助于寫出可復用和可維護性高的程序 設計模式的原則是“找出 程序中變化的地方,并將變化封裝起來”,它的關鍵是意圖,而不是結構。 不過要注意,使用不當的話,可能會事倍功半。 ## 一、**單例模式** 1.定義 保證一個類僅有一個實例,并提供一個訪問他的全局訪問點 2.核心 確保只有一個實例,并提供全局訪問 3.實現 假設要設置一個管理員,多次調用也僅設置一次,我們可以使用閉包緩存一個內部變量來實現這個單例 ``` function SetManager(name) { this.manager = name; } SetManager.prototype.getName = function() { console.log(this.manager); }; var SingletonSetManager = (function() { var manager = null; return function(name) { if (!manager) { manager = new SetManager(name); } return manager; } })(); SingletonSetManager('a').getName(); // a SingletonSetManager('b').getName(); // a SingletonSetManager('c').getName(); // a ``` 此為比較簡單的做法,但是假如我們還要設置一個別的角色比如說HR呢?就得復制一遍代碼了 所以,可以改寫單例內部,實現的更通用一些 ~~~ // 提取出通用的單例 function getSingleton(fn) { var instance = null; return function() { if (!instance) { instance = fn.apply(this, arguments); } return instance; } } ~~~ >在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(context)而存在的,換句話說,就是為了改變函數體內部 this 的指向。 //先解釋一下apply方法 ``` //一、 var name = '小王', age = 17; var obj = { name: '小張', objAge: this.age, myFun: function() { console.log( this.name + '年 齡' + this.age ) } } obj.objAge; //17 obj.myFun() //小張年齡 undefined //二、 var fav = '弱智' function show() { console.log(this.fav) } show() //弱智 可以發現第一個打印的this指向obj,第二個全局聲明this指向window call/apply/bind都是用來重新定義this這個對象的 如一中的代碼 加 var db = { name: '神經病', age: 99 } obj.myFun.apply(db); //神經病年齡 99 ``` 接上所述 我們提取好之后,再進行調用 結果還是一樣 ***** # **觀察者模式** **概念:** >觀察者模式是軟件設計模式的一種。在此種模式中,一個目標對象管理所有相依于它的觀察者對象,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實時事件處理系統。 說的簡單些,就是在<font style="color: red">數據發生</font>改變時,對應的處理函數自動執行。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看