国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS之14種設計模式 (6)

luckyyulin / 1211人閱讀

摘要:序列文章面試之函數面試之對象面試之數組的幾個不操作面試之對比分析面試之數據結構與算法前言設計模式如果應用到項目中,可以實現代碼的復用和解耦,提高代碼質量。

序列文章

JS面試之函數(1)
JS面試之對象(2)
JS面試之數組的幾個不low操作(3)
JS面試之http0.9~3.0對比分析(4)
JS面試之數據結構與算法 (5)

前言
設計模式如果應用到項目中,可以實現代碼的復用和解耦,提高代碼質量。 本文主要介紹14種設計模式
寫UI組件,封裝框架必備
1.簡單工廠模式

1.定義:又叫靜態工廠方法,就是創建對象,并賦予屬性和方法
2.應用:抽取類相同的屬性和方法封裝到對象上
3.代碼:

    let UserFactory = function (role) {
  function User(opt) {
    this.name = opt.name;
    this.viewPage = opt.viewPage;
  }
  switch (role) {
    case "superAdmin":
      return new User(superAdmin);
      break;
    case "admin":
      return new User(admin);
      break;
    case "user":
      return new User(user);
      break;
    default:
      throw new Error("參數錯誤, 可選參數:superAdmin、admin、user")
  }
}

//調用
let superAdmin = UserFactory("superAdmin");
let admin = UserFactory("admin") 
let normalUser = UserFactory("user")
//最后得到角色,可以調用
2.工廠方法模式

1.定義:對產品類的抽象使其創建業務主要負責用于創建多類產品的實例
2.應用:創建實例
3.代碼:

var Factory=function(type,content){
  if(this instanceof Factory){
    var s=new this[type](content);
    return s;
  }else{
    return new Factory(type,content);
  }
}

//工廠原型中設置創建類型數據對象的屬性
Factory.prototype={
  Java:function(content){
    console.log("Java值為",content);
  },
  PHP:function(content){
    console.log("PHP值為",content);
  },
  Python:function(content){
    console.log("Python值為",content);
  },
}

//測試用例
Factory("Python","我是Python");
3.原型模式

1.定義:設置函數的原型屬性
2.應用:實現繼承
3.代碼:

function Animal (name) {
  // 屬性
  this.name = name || "Animal";
  // 實例方法
  this.sleep = function(){
    console.log(this.name + "正在睡覺!");
  }
}
// 原型方法
Animal.prototype.eat = function(food) {
  console.log(this.name + "正在吃:" + food);
};

function Cat(){ 
}
Cat.prototype = new Animal();
Cat.prototype.name = "cat";

// Test Code
var cat = new Cat();
console.log(cat.name);//cat
console.log(cat.eat("fish"));//cat正在吃:fish  undefined
console.log(cat.sleep());//cat正在睡覺! undefined
console.log(cat instanceof Animal); //true 
console.log(cat instanceof Cat); //true  
4.單例模式

1.定義:只允許被實例化依次的類
2.應用:提供一個命名空間
3.代碼:

let singleCase = function(name){
    this.name = name;
};
singleCase.prototype.getName = function(){
    return this.name;
}
// 獲取實例對象
let getInstance = (function() {
    var instance = null;
    return function(name) {
        if(!instance) {//相當于一個一次性閥門,只能實例化一次
            instance = new singleCase(name);
        }
        return instance;
    }
})();
// 測試單體模式的實例,所以one===two
let one = getInstance("one");
let two = getInstance("two");   
5.外觀模式

1.定義:為子系統中的一組接口提供一個一致的界面
2.應用:簡化復雜接口
3.代碼:
外觀模式

6.適配器模式

1.定義:將一個接口轉換成客戶端需要的接口而不需要去修改客戶端代碼,使得不兼容的代碼可以一起工作
2.應用:適配函數參數
3.代碼:
適配器模式

7.裝飾者模式

1.定義:不改變原對象的基礎上,給對象添加屬性或方法
2.代碼

let decorator=function(input,fn){
  //獲取事件源
  let input=document.getElementById(input);
  //若事件源已經綁定事件
  if(typeof input.onclick=="function"){
    //緩存事件源原有的回調函數
    let oldClickFn=input.onclick;
    //為事件源定義新事件
    input.onclick=function(){
      //事件源原有回調函數
      oldClickFn();
      //執行事件源新增回調函數
      fn();
    }
  }else{
    //未綁定綁定
    input.onclick=fn;
  }
}

//測試用例
decorator("textInp",function(){
  console.log("文本框執行啦");
})
decorator("btn",function(){
  console.log("按鈕執行啦");
})
8.橋接模式

1.定義:將抽象部分與它的實現部分分離,使它們都可以獨立地變化
2.代碼
橋接模式

9.模塊方法模式

1.定義:定義一個模板,供以后傳不同參數調用
2.代碼:
模塊方法模式

10.觀察者模式

1.作用:解決類與對象,對象與對象之間的耦合
2.代碼:

let Observer=
  (function(){
    let _message={};
    return {
      //注冊接口,
        //1.作用:將訂閱者注冊的消息推入到消息隊列
        //2.參數:所以要傳兩個參數,消息類型和處理動作,
        //3.消息不存在重新創建,存在將消息推入到執行方法
        
      regist:function(type,fn){
        //如果消息不存在,創建
        if(typeof _message[type]==="undefined"){
          _message[type]=[fn];
        }else{
          //將消息推入到消息的執行動作
          _message[type].push(fn);
        }
      },

      //發布信息接口
        //1.作用:觀察這發布消息將所有訂閱的消息一次執行
        //2.參數:消息類型和動作執行傳遞參數
        //3.消息類型參數必須校驗
      fire:function(type,args){
        //如果消息沒有注冊,則返回
        if(!_message[type]) return;
          //定義消息信息
          var events={
            type:type, //消息類型
            args:args||{} //消息攜帶數據
          },
          i=0,
          len=_message[type].length;
          //遍歷消息
          for(;i=0;i--){
            //如果存在該動作在消息隊列中移除
            _message[type][i]===fn&&_message[type].splice(i,1);
          }
        }
      }
    }
  })()

//測試用例
  //1.訂閱消息
  Observer.regist("test",function(e){
    console.log(e.type,e.args.msg);
  })

  //2.發布消息
  Observer.fire("test",{msg:"傳遞參數1"});
  Observer.fire("test",{msg:"傳遞參數2"});
  Observer.fire("test",{msg:"傳遞參數3"});
11.狀態模式

1.定義:一個對象狀態改變會導致行為變化
2.作用:解決復雜的if判斷
3.代碼
狀態模式

12.策略模式

1.定義:定義了一系列家族算法,并對每一種算法多帶帶封裝起來,讓算法之間可以相互替換,獨立于使用算法的客戶
2.代碼
策略模式

13.訪問模式

1.定義:通過繼承封裝一些該數據類型不具備的屬性,
2.作用:讓對象具備數組的操作方法
3.代碼:
訪問者模式

14.中介者模式

1.定義:設置一個中間層,處理對象之間的交互
2.代碼:
中介者模式

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103360.html

相關文章

  • JavaScript物理引擎Matter.js與Box2d性能對比

    摘要:數據采集因為是測試物理引擎的性能,這里不考慮,只采集物理引擎更新每一幀的時間,因為除開物理引擎,渲染引擎也會帶來性能消耗。 前言 在挑選JavaScript 2D物理引擎的時候,不外乎兩種主流的選擇:第一種是老牌的Box2D,最開始的版本是C++實現的,后來有了很多種實現,比如flash版本和js版本,具體可看:https://stackoverflow.com/que...;第二種是...

    whinc 評論0 收藏0
  • JS數組的幾個不low操作(3)

    摘要:序列文章面試之函數面試之對象前言本文主要從應用來講數組的一些騷操作如一行代碼扁平化維數組數組去重求數組最大值數組求和排序對象和數組的轉化等上面這些應用場景你可以用一行代碼實現扁平化維數組終極篇是扁平數組的表示維度值為時維度為無限大開始篇實質 showImg(https://segmentfault.com/img/bVbpRMS?w=1858&h=1286); 序列文章 JS面試之函數...

    fish 評論0 收藏0
  • JS 數組的幾個經典api

    摘要:一扁平化嵌套數組展平和陣列孔實現效果方法刪除數組中的空槽該方法創建一個新數組,所有子數組元素以遞歸方式連接到指定的深度。深度級別指定嵌套數組結構應該展平的深度。方法解讀該方法的實質是利用遞歸和數組合并方法實現扁平。是將類數組轉化為數組。 本文主要來講數組api的一些操作,如簡單實現扁平化n維數組、數組去重、求數組最大值、數組求和、排序、對象和數組的轉化等。 一、 扁平化嵌套數組/展平和...

    陳江龍 評論0 收藏0
  • 溫故知新JS基礎

    摘要:訪問屬性是通過操作符完成的,但這要求屬性名必須是一個有效的變量名小紅的屬性名不是一個有效的變量,就需要用括起來。閉包應用封裝私有變量箭頭函數箭頭函數相當于匿名函數,并且簡化了函數定義。 數據類型 NAN NaN === NaN; // false 唯一能判斷NaN的方法是通過isNaN()函數: isNaN(NaN); // true 浮點數的相等比較: 1 / 3 === (...

    Dr_Noooo 評論0 收藏0

發表評論

0條評論

luckyyulin

|高級講師

TA的文章

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