欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學習JavaScript設計模式之裝飾者模式

 更新時間:2016年01月19日 09:55:54   作者:奮飛  
這篇文章主要為大家介紹了JavaScript設計模式中的裝飾者模式,對JavaScript設計模式感興趣的小伙伴們可以參考一下

有時我們不希望某個類天生就非常龐大,一次性包含許多職責。那么我們就可以使用裝飾著模式。
裝飾著模式可以動態(tài)地給某個對象添加一些額外的職責,從而不影響這個類中派生的其他對象。
裝飾著模式將一個對象嵌入另一個對象之中,實際上相當于這個對象被另一個對象包裝起來,形成一條包裝鏈。

一、不改動原函數(shù)的情況下,給該函數(shù)添加些額外的功能

1. 保存原引用

window.onload = function() {
  console.log(1);
};

var _onload = window.onload || function() {};

window.onload = function() {
  _onload();
  console.log(2);
}

問題:
(1)必須維護中間變量
(2)可能遇到this被劫持問題
在window.onload的例子中沒有這個煩惱,是因為調用普通函數(shù)_onload時,this也指向window,跟調用window.onload時一樣。

2. this被劫持:

var _getElementById = document.getElementById;
document.getElementById = function(id) {
  console.log(1);
  return _getElementById(id);
}

return _getElementById(id); // 報錯“Uncaught TypeError: Illegal invocation”

因為_getElementById是全局函數(shù),當調用全局函數(shù)時,this是指向window的,而document.getElementById中this預期指向document。

3. 解決this被劫持:

var _getElementById = document.getElementById;
document.getElementById = function(id) {
  console.log(1);
  return _getElementById.call(document, id);
}

二、用AOP裝飾函數(shù)

/* 讓新添加的函數(shù)在原函數(shù)之前執(zhí)行(前置裝飾)*/
Function.prototype.before = function(beforefn) {
  var _self = this;
  return function() {
    beforefn.apply(this, arguments);  // 新函數(shù)接收的參數(shù)會被原封不動的傳入原函數(shù)
    return _self.apply(this, arguments);
  };
};

/* 讓新添加的函數(shù)在原函數(shù)之后執(zhí)行(后置裝飾)*/
Function.prototype.after = function(afterfn) {
  var _self = this;
  return function() {
    var ret = _self.apply(this, arguments);
    afterfn.apply(this, arguments);
    return ret;
  };
};

document.getElementById = document.getElementById.before(function() {
  console.log(1);
});

三、避免污染原型

var before = function(fn, beforefn) {
  return function() {
    beforefn.apply(this, arguments);
    return fn.apply(this, arguments);
  };
};

var after = function(fn, afterfn) {
  return function() {
    var ret = fn.apply(this, arguments);
    afterfn.apply(this, arguments);
    return ret;
  };
};

document.getElementById = before(document.getElementById, function(){
  console.log(1);
});

四、示例–插件式的表單驗證

結合《學習JavaScript設計模式之策略模式》中的【表單驗證】,運用到ajax提交數(shù)據(jù)驗證,效果很棒!

修改上述before方法

var before = function(fn, beforefn) {
  return function() {
    if(beforefn.apply(this, arguments) === false) {
      // beforefn返回false,直接return,不執(zhí)行后面的原函數(shù)
      return;
    }
    return fn.apply(this, arguments);
  };
};
/* 模擬數(shù)據(jù)驗證*/
var validate = function() {
  if(username === "") {
    console.log("驗證失?。?);
    return false;
  }
  return true;
}
/* 模擬ajax提交*/
var formSubmit = function() {
  console.log("提交?。?!");
}
username = 1;
formSubmit = before(formSubmit, validate); // 提交?。?!
formSubmit();

username = "";
formSubmit = before(formSubmit, validate); // 驗證失敗!
formSubmit();

五、裝飾者模式和代理模式

相同點:這兩種模式都描述了怎么為對象提供一定程度上的間接引用,它們的實現(xiàn)部分都保留了對另外一個對象的引用,并且向那個對象發(fā)送請求。
區(qū)別:
(1)代理模式:當直接訪問本地不方便或者不符合需求時,為這個本體提供一個替代者。本地定義關鍵功能,而代理提供或拒絕對它的訪問,或者在訪問本體之前走一些額外的事情。(其做的事情還是跟本體一樣)
(2)裝飾者模式:為對象動態(tài)加入行為。(一開始不能確定對象的全部功能,實實在在的為對象添加新的職責和行為)

希望本文所述對大家學習javascript程序設計有所幫助。

相關文章

  • JavaScript筆記之數(shù)據(jù)屬性和存儲器屬性

    JavaScript筆記之數(shù)據(jù)屬性和存儲器屬性

    本文給大家介紹js數(shù)據(jù)屬性和存儲器屬性,及兩種屬性的區(qū)別,對js數(shù)據(jù)屬性存儲器屬性相關知識感興趣的朋友一起學習
    2016-03-03
  • CSS3 動畫卡頓性能優(yōu)化的完美解決方案

    CSS3 動畫卡頓性能優(yōu)化的完美解決方案

    今天小編就為大家分享一篇關于css3 動畫卡頓性能優(yōu)化的完美解決方案,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-09-09
  • JS實現(xiàn)獲取各種格式的時間

    JS實現(xiàn)獲取各種格式的時間

    在?JavaScript?中,可以使用內置的?Date?對象來獲取當前時間,并根據(jù)需要格式化成不同的時間格式,下面就跟隨小編一起來看看具體的使用吧
    2023-08-08
  • javascript實現(xiàn)表單隔行變色

    javascript實現(xiàn)表單隔行變色

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)表單隔行變色,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • canvas紅包照片實例分享

    canvas紅包照片實例分享

    本文主要分享了canvas紅包照片的實例代碼,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 學習JavaScript事件流和事件處理程序

    學習JavaScript事件流和事件處理程序

    這篇文章主要為大家介紹了學習JavaScript事件流和事件處理程序的注意事項,感興趣的小伙伴們可以參考一下
    2016-01-01
  • JavaScript 異步調用框架 (Part 3 - 代碼實現(xiàn))

    JavaScript 異步調用框架 (Part 3 - 代碼實現(xiàn))

    在上一篇文章里,我們說到了要實現(xiàn)一個Async.Operation類,通過addCallback方法傳遞回調函數(shù),并且通過yield方法返回回調結果?,F(xiàn)在我們就來實現(xiàn)這個類吧。
    2009-08-08
  • 微信小程序實現(xiàn)單選選項卡切換效果

    微信小程序實現(xiàn)單選選項卡切換效果

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)單選選項卡切換效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • js模仿windows桌面圖標排列算法具體實現(xiàn)(附圖)

    js模仿windows桌面圖標排列算法具體實現(xiàn)(附圖)

    需要引入Jquery,如果需要全部功能,請引入jquery-ui和jquery-ui.css,具體實現(xiàn)步驟如下,感興趣的朋友可以參考下哈
    2013-06-06
  • js獲取form的方法

    js獲取form的方法

    這篇文章主要介紹了js獲取form的方法,實例分析了javascript操作form表單的技巧,需要的朋友可以參考下
    2015-05-05

最新評論