JS設計模式

*工廠模式factory

DEMO                                         使用場景:創建一個簡單的對象
   function Person(name) {                  
     var temp={                           
       temp.name=name;
       temp.sayName=function () {
         console.log(this.name);
       }
     };
     return temp;
   }
   createPerson("Lucy");                     生成實例 = 創建一個新的引用方式
   createPerson("Eall");                                 開辟新的內存空間

   與構造函數同為 引用類型 ; 但無法知道實例是由哪個構造函數創建的

*構造函數模式constructor

DEMO                                          使用場景:創建一個復雜的對象,可以添加方法
   function People(name,age){                  
       this.name = name;                      寫一個函數
       this.age = age;                         綁定this
   }
   People.prototype.sayName = function(){      將方法掛在函數原型上
        console.log(this.name)
   }
   var singer = new People('Jay','33');        使用new生成實例 開辟內存空間
   singer.sayName();

*單例模式single

DEMO                                 使用場景:只需出現一次,獨一無二的組件
    var Person=(function () {                 一個立即執行函數
      var temp;
      function init(name,age) {                
        return {
            name:name,
            age:age,
            sayName:function () {
                console.log(this.name);       return出來的值是 閉包里的變量
             }
          }
       }
       return {
          createPerson:function (name,age) {
            if(!temp){                        // 如果沒有temp就初始化
                temp=init(name,age);       
            }                             // 所以第一次調用就初始化,之后不再執行這段代碼
            return temp;                      
          }                                  單例就是只開辟了一個內存空間
       }                                     第一次傳入的值被儲存下來
    }());                                    之后生成的實例全都指向同樣的地方 
    Person.createPerson("lucy",23); // lucy
    Person.createPerson("lily",24);// lucy

*混合模式mixin

DEMO                                            使用場景:可繼承的公用方法
   function Person(name,age) {                           構造函數 1
       this.name=name;
       this.age=age;
   }
   Person.prototype.sayName=function () {                 
       console.log(this.name);
   }

   function Student(name,age,score) {                    構造函數 2
       Person.call(this,name,age);
       this.score=score;
   } 
   Student.prototype.sayScore=function () {     
       console.log(this.score);
   }

inherit 1:
   function inherit(parent,sun) {                        
       sun.prototype=Object.create(parent.prototype);    差異化繼承
       sun.prototype.constructor=sun;
   }
   inherit(Person,Student);                              2就繼承了 1
inherit 2:
   student.prototype=create(parent.prototype); 
   function creat(parentObj){
       function F(){}//新建一個空對象
       F.prototype=parentObj;//原型指向參數
       return new F;//實例化一個原型指向參數的空對象
   }

   var student1=new Student("lucy",24,100);
   student1.sayScore();
   student1.sayName();

*模塊模式moudle

DEMO                                       使用場景:需要封裝的組件
   var person=(function () {
        var name="lucy",            一個模塊 = 一個私有作用域 = 一個匿名函數
        age=23;
      function sayName() {
        console.log(name);
      }// 詞法作用域:一個函數可以訪問到的上下文環境由它所定義的位置決定。
      return{                                     
        name:name,                      留出接口
        age:age,
        sayName:sayName
      }
   })();
   person.sayName();

*發布訂閱模式subscribe publish

DEMO
    var EventCenter=(function () {  // 新建訂閱中心

      var events={};                // 新建緩存列表,存儲訂閱者的回調函數

      function on(evt,handler) {    // 添加消息:綁定事件
        events[evt]=events[evt]||[];// 檢查事件列表events{}里是否有這個key 
                                       *如果有,那就是這個事件了;
                                       *如果沒有,就初始化這個數組,加入事件
        events[evt].push({          // 在[]里增加一個函數
            handler:handler         // 即 events={evt:[handler:handler]}
        })                               events={事件:[訂閱者1:function(args){...}; 
       }                                               訂閱者2:function(args){...};
                                                                                  ] }
      function off(evt) {           // 解除訂閱:移除事件
        delete events[evt];
      }
      function fire(evt,args) {     // 發布訂閱:觸發事件
        if(!events[evt]){           // 如果evt不存在,就返回
            return;
        }                           // 如果存在,遍歷列表events,依次執行處理程序
        for(var i=0;i<events[evt].length;i++){
            events[evt][i].handler(args);
        }
      }
      return {
        on:on,                       // 導出接口
        off:off,
        fire:fire
      }
    })();
    EventCenter.on('change', function(val){
      console.log('change...  now val is ' + val);
    });
    EventCenter.fire('change', '饑人谷'); //change...  now val is 饑人谷
    EventCenter.off('change');

    優點:代碼解耦;異步使用;實現自定義組件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、寫出 構造函數模式、混合模式、模塊模式、工廠模式、單例模式、發布訂閱模式的范例。 1、設計模式分類: 構造函數...
    撫年華輕過閱讀 504評論 0 1
  • 1.什么叫做設計模式(基本概念) 在面向對象軟件設計過程中,針對問題進行簡潔而優雅的一種解決方案 設計模式是在某種...
    Jianshu9527閱讀 349評論 0 3
  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創建,需要時才創建 最常見的單例模式,...
    Obeing閱讀 2,110評論 1 10
  • 單例模式: 目的是創建全局唯一可用的對象 訂閱-發布者模式 (觀察者模式) 觀察者模式又叫發布訂閱模式(Publi...
    wuliJJ閱讀 328評論 0 0
  • 寫出 構造函數模式、混合模式、模塊模式、工廠模式、單例模式、發布訂閱模式的范例。構造函數模式var Person ...
    htkz_117f閱讀 161評論 0 0