javascript中常見的三種開發模式

来源:https://www.cnblogs.com/zhanglongke/archive/2019/03/26/10603185.html
-Advertisement-
Play Games

一、單例模式: 所謂單例模式,即保證一個類只有一個實例,並提供一個訪問它的全局訪問點。 單例模式實現彈出層: 二、觀察者模式: 所謂觀察者模式,即(發佈-訂閱模式):其定義對象間一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都將得到通知。 觀察者模式常見面試題: 三、組合模式: ...


一、單例模式:

  所謂單例模式,即保證一個類只有一個實例,並提供一個訪問它的全局訪問點。

  

<script type="text/javascript">
            //一個類有某個實例,就用這個實例,沒有的話,就新生成一個實例

            var singleTon = (function(){
                var _instance = null;
                
                function Foo(){
                    this.a = "**";
                    this.b = "**";
                }
                Foo.prototype.fn = function(){
                    
                }

                return {
                    getInstance:function(){
                        if(!_instance){
                            _instance = new Foo();
                        }
                        return _instance;
                    }
                }
            })();
 console.log(singleTon.getInstance()==singleTon.getInstance());
            
             
        </script>

  單例模式實現彈出層:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            div{
                height: 100px;
                width: 100px;
                background: red;
            }
        </style>
    </head>
    <body>
        <input type="button" id="btn" value="彈出層" />
        
        <script type="text/javascript">
            (function(){
                var oBtn = document.getElementById("btn");
                var _instance = null;
                //創建彈窗類
                function PopBox(){
                    this.node = document.createElement("div");
                    document.body.appendChild(this.node);
                }
                oBtn.onclick = function(){
                    if(!_instance){
                        _instance = new PopBox;
                    }
                }
                
            })();
        </script>
    </body>
</html>

二、觀察者模式:

  所謂觀察者模式,即(發佈-訂閱模式):其定義對象間一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都將得到通知。

  

<script type="text/javascript">
        var observer = {
            regist:function(eventName,callback){
                if(!this.obj){
                    this.obj = {};
                }
                if(!this.obj[eventName]){
                    this.obj[eventName] = [callback];
                }else{
                    this.obj[eventName].push(callback);
                }
                
                
            },
            emit:function(eventName){
                if(this.obj[eventName]){
                    for(var i = 0; i < this.obj[eventName].length; i++){
                        this.obj[eventName][i]();
                    }
                }
            },
            remove:function(eventName,callback){
                if(this.obj[eventName]){
                    for(var i = 0; i < this.obj[eventName].length;i++){
                        if(this.obj[eventName][i]==callback){
                            this.obj[eventName].splice(i,1);
                        }
                    }
                }
            }
        };
        
        //購物車模塊註冊的事件
        observer.regist("loginSucess",function(){
            console.log("購物車模塊發生改變");
        });
        //個人信息模塊註冊的事件
        observer.regist("loginSucess",function(){
            console.log("個人信息模塊發生改變");
        });
        
        observer.emit("loginSucess");//
    </script>

  觀察者模式常見面試題:

  

<script type="text/javascript">
            var Event = {
                // 通過on介面監聽事件eventName
                // 如果事件eventName被觸發,則執行callback回調函數
                on: function(eventName, callback) {
                    //你的代碼 註冊事件
                    if(!this.obj){
                        Object.defineProperty(this,"obj",{
                            value:{},
                            enumerabel:false
                        })
                    }
                    if(!this.obj[eventName]){
                        this.obj[eventName] = [callback];
                    }else{
                        this.obj[eventName].push(callback);
                    }
                },
                // 觸發事件 eventName
                emit: function(eventName) {
                    //你的代碼 發佈事件
                    if(this.obj[eventName]){
                        for(var i = 0; i < this.obj[eventName].length; i++){
                            this.obj[eventName][i](arguments[1]);
                        }
                    }
                }
            };
            
            
            // 測試1
            Event.on('test', function(result) {
                console.log(result);
            });
            Event.on('test', function() {
                console.log('test');
            });
            Event.emit('test', 'hello world'); // 輸出 'hello world' 和 'test'
            
            
        
            // 測試2
            var person1 = {};
            var person2 = {};
            
            Object.assign(person1, Event);
            Object.assign(person2, Event);
            
            person1.on('call1', function() {
                console.log('person1');
            });
            
            person2.on('call2', function() {
                console.log('person2');
            });
            
            person1.emit('call1'); // 輸出 'person1'
            person1.emit('call2'); // 沒有輸出
            person2.emit('call1'); // 沒有輸出
            person2.emit('call2'); // 輸出 'person2'

        </script>

三、組合模式:

  組合模式又稱部分-整體模式,將對象組合成樹形結構以表示“部分整體”的層次結構。

<script type="text/javascript">
        //訂單系統  票務系統  酒店系統
        
        function Ticket(){
            
        }
        Ticket.prototype.create = function(){
            console.log("創建了機票訂單");
        }

        function Hotel(){
            
        }
        Hotel.prototype.create = function(){
            console.log("創建了酒店訂單");
        }

        function Order(){
            this.orders = [];
        }
        Order.prototype.addOrder = function(order){
            this.orders.push(order);
            return this;
        }
        Order.prototype.create = function(){
            for(var i = 0; i < this.orders.length; i++){
                this.orders[i].create();
            }
        }
        
        var order = new Order();
        order.addOrder(new Ticket()).addOrder(new Ticket())
        .addOrder(new Hotel());
        
        order.create();
    </script>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在大多運行室的引流或者業務操作中,理論上需要使用安卓的神一般的Xposed框架,上周我們運行室購來了一批新的vivo機器,理論上都是基於7.0以上系統版本,理論上不能夠獲得root的su許可權,雖然一部分能但非常麻煩,甚至也有獲得root的su許可權後重啟設備就恢復無root狀態的情況出現,很是焦慮的一 ...
  • App瘦身 資源瘦身 使用tinypng壓縮PNG圖片。視頻可以通過 Final cut等軟體進行解析度壓縮。音頻則降低碼率即可。 非必須資源文件可以放到自己伺服器上 啟動圖使用 LaunchScreen.storyboard,啟動圖在一個項目資源中占比其實蠻大的,但是使用 LaunchScreen ...
  • 前言 在iOS中,NSTimer的使用是非常頻繁的,但是NSTimer在使用中需要註意,避免迴圈引用的問題。之前經常這樣寫: - (void)setupTimer { self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self ...
  • 在越來越多應用室的引流,或業務操作中,大多數需要使用安卓的強大Xposed框架,前幾天,我們應用室採購了一批新的vivo4.0系統,大多數都是基於7.0以上系統,大多數不能夠刷入Root的su許可權,即使一些可以但非常麻煩,甚至也有刷入Root的su許可權後重啟設備就恢復無Root狀態的情況發生,很是頭 ...
  • 在前端開發中,許多新手常會遇見一個問題,參考的網頁上有類似下圖的圖標,但在資源里卻找不到對應的文件,這是因為這些網頁使用了圖標庫。這裡介紹一種常見的圖標庫——FontAwesome的使用。 1.登錄Font Awesome官網,下載Font Awesome安裝包,最好下載最新版本的,因為最新版本中的 ...
  • 一、問題描述 問題是這樣的,後臺傳了xArr = [x1, x2,...,xn]和yArr = [y1, y2, ..yn]兩個數組,前端要渲染出表格並且可以填寫每個單元格的值,然後按照一定數據結構保存並傳給後臺,並且再次獲取這個數據結構和數組xArr、yArr可以自己渲染出這個表?實現新增和修改的 ...
  • usually.js 是一個面向現代 Web 開發的 JavaScript 函數庫,基於 ES6 開發。最新版本2.4.1,最新版本usually.js增加管道函數—— pipe 函數。什麼是管道函數?管道函數,其作用是將前一步的結果直接傳參給下一步的函數,從而省略了中間的賦值步驟,可以大量減少記憶體... ...
  • 一、快捷位置和尺寸屬性 DOM已經提供給我們計算後的樣式,但是還是覺得不方便,因為計算後的樣式屬性值都是字元串類型。 不能直接參与運算。 所以DOM又提供了一些API:得到的就是number類型的數據,不需要parseInt(),直接可以參與運算。 offsetLeft和offsetTop offs ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...