JavaScript設(shè)計(jì)模式學(xué)習(xí)之方法擴(kuò)展

本文僅僅是記錄自己學(xué)習(xí)的心得體會(huì),如果有誤枣申,歡迎指出售葡,非原創(chuàng),具體請(qǐng)參考:《JavaScript設(shè)計(jì)模式》 張容銘 著

情景:現(xiàn)在有需求忠藤,寫三個(gè)驗(yàn)證挟伙,分別是賬號(hào),郵箱模孩,手機(jī)的驗(yàn)證尖阔。
分析
1.一般我們習(xí)慣于直接寫三個(gè)函數(shù)解決

    function checkOutUserAccount() {
        //驗(yàn)證用戶賬戶
    }
    function checkOutUserEmail() {
        //驗(yàn)證用戶郵箱
    }
    function checkOutUserMobile() {
        //驗(yàn)證用戶手機(jī)
    }

這樣使用會(huì)導(dǎo)致一個(gè)問(wèn)題:無(wú)形之中在全局中聲明了三個(gè)變量,等同于下面的效果:

    var checkOutUserAccount = function () {
        //驗(yàn)證用戶賬戶
    }
    var checkOutUserEmail = function () {
        //驗(yàn)證用戶郵箱
    }
    var checkOutUserMobile = function () {
        //驗(yàn)證用戶手機(jī)
    }

這樣子做榨咐,功能是可以實(shí)現(xiàn)介却,但是卻是全局變量,不利于團(tuán)隊(duì)項(xiàng)目的開(kāi)發(fā)块茁,如果別人定義了相同的方法齿坷,你的方法將會(huì)被覆蓋

2.將這三個(gè)方法裝進(jìn)對(duì)象中

    
var CheckOutObject = {
    checkOutUserAccount:function () {
      //驗(yàn)證用戶賬戶
    },
    checkOutUserEmail:function () {
      //驗(yàn)證用戶郵箱
    },
    checkOutUserMobile:function () {
      //驗(yàn)證用戶手機(jī)
    }
}

也可以這樣(函數(shù)也是對(duì)象)

var CheckOutObject = function () {};
CheckOutObject.checkOutUserAccount = function () {
  //驗(yàn)證用戶賬戶
}
CheckOutObject.checkOutUserEmail = function () {
  //驗(yàn)證用戶郵箱
}
CheckOutObject.checkOutUserMobile = function () {
  //驗(yàn)證用戶手機(jī)
}

如何使用:CheckOutObject.checkOutUserAccount() //點(diǎn)語(yǔ)法調(diào)用

當(dāng)然也可以在函數(shù)中返回一個(gè)包裹這三個(gè)方法的對(duì)象:

var CheckOutObject = function () {
    return {
      checkOutUserAccount:function () {
        //驗(yàn)證用戶賬戶
      },
      checkOutUserEmail:function () {
        //驗(yàn)證用戶郵箱
      },
      checkOutUserMobile:function () {
        //驗(yàn)證用戶手機(jī)
      }
    }
}

如何使用:var checkOut = CheckOutObject(); //得到返回對(duì)象 存在checkOut中 checkOut.checkOutUserAccount();//調(diào)用返回對(duì)象中的方法

上面這種方法在每一次調(diào)用的時(shí)候,得到的都是返回的新的對(duì)象数焊,互相不干擾永淌。當(dāng)然也可以通過(guò)實(shí)現(xiàn)
3.實(shí)用類

var CheckOutObject = function () {
    this.checkOutUserAccount = function () {
      //驗(yàn)證用戶賬戶
    }
    this.checkOutUserEmail = function () {
      //驗(yàn)證用戶郵箱
    }
    this.checkOutUserMobile = function () {
      //驗(yàn)證用戶手機(jī)
    }
}

這樣就可以用CheckOutObject類創(chuàng)建出來(lái)的對(duì)象了

var checkOut = new CheckOutObject(); //創(chuàng)建一個(gè)新對(duì)象checkOut
checkOut.checkOutUserAccount() //調(diào)用對(duì)象中的方法

在new CheckOutObject的時(shí)候,實(shí)際上是執(zhí)行了一次CheckOutObject佩耳,this指向調(diào)用者checkOut遂蛀,所以新創(chuàng)建的對(duì)象會(huì)對(duì)CheckOutObject類中this定義的方法進(jìn)行復(fù)制。所以每一個(gè)新創(chuàng)建的對(duì)象都會(huì)有一套自己的方法

當(dāng)然這樣創(chuàng)建也是奢侈的干厚,可做修改

4.在原型對(duì)象上添加

//一個(gè)一個(gè)往原型上面添加方法
var CheckOutObject = function () {};
CheckOutObject.prototype.checkOutUserAccount = function () {
  //驗(yàn)證用戶賬戶
}
CheckOutObject.prototype.checkOutUserEmail = function () {
  //驗(yàn)證用戶郵箱
}
CheckOutObject.prototype.checkOutUserMobile = function () {
  //驗(yàn)證用戶手機(jī)
}

當(dāng)然也可以這樣

//重寫原型對(duì)象
var CheckOutObject = function () {};
CheckOutObject.prototype = {
    checkOutUserAccount:function () {
      //驗(yàn)證用戶賬戶
    },
    checkOutUserEmail:function () {
      //驗(yàn)證用戶郵箱
    },
    checkOutUserMobile:function () {
      //驗(yàn)證用戶手機(jī)
    }
}

如何使用:var checkOut = new CheckOutObject();//new 一個(gè)新對(duì)象checkOut checkOut.checkOutUserAccount();//調(diào)用原型上的方法

但是如果需要調(diào)用許多方法李滴,就會(huì)寫很多次checkOut
例如:checkOut.checkOutUserAccount() checkOut.checkOutUserEmail() checkOut.checkOutUserMobile()這里書寫三次,如果有更多方法呢蛮瞄?可以利用this將調(diào)用者返回(下面例子this指向的調(diào)用者是checkOut)所坯,這樣實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用、
5.實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

var CheckOutObject = function () {};
CheckOutObject.prototype = {
    checkOutUserAccount:function () {
      //驗(yàn)證用戶賬戶
      return this
    },
    checkOutUserEmail:function () {
      //驗(yàn)證用戶郵箱
      return this
    },
    checkOutUserMobile:function () {
      //驗(yàn)證用戶手機(jī)
      return this
    }
}

如何使用:var checkOut = new CheckOutObject(); checkOut.checkOutUserAccount().checkOutUserEmail().checkOutUserMobile();//這也許就是傳說(shuō)中的鏈?zhǔn)秸{(diào)用了

checkOut.checkOutUserAccount().checkOutUserEmail().checkOutUserMobile();這里是checkOut調(diào)用裕坊,當(dāng)執(zhí)行到checkOut.checkOutUserAccount();因?yàn)?code>return this包竹,而這里的this指向checkOut,所以就相當(dāng)于返回了checkOut籍凝。所以語(yǔ)句就變成了checkOut. .checkOutUserEmail().checkOutUserMobile();以此類推周瞎,最后變成checkOut.checkOutUserMobile();

這里是在CheckOutObject 這個(gè)類的原型上添加的,那么只可以在new出來(lái)的新對(duì)象上面使用饵蒂,如果想實(shí)現(xiàn)每一個(gè)函數(shù)都帶有這個(gè)方法呢声诸?
6.在Function的原型上添加

Function.prototype.checkOutUserAccount = function () {
    //驗(yàn)證用戶賬戶
}
Function.prototype.checkOutUserEmail = function () {
    //驗(yàn)證用戶郵箱
}
Function.prototype.checkOutUserMobile = function () {
    //驗(yàn)證用戶手機(jī)
}

如何使用:如果習(xí)慣使用函數(shù)形式:var checkOut = function () {}; checkOut.checkOutUserAccount()
如果習(xí)慣使用類的形式:var checkOut = new Function();checkOut.checkOutUserAccount();

但是如果這樣做,方便了自己退盯,卻會(huì)污染原生對(duì)象Function彼乌,所以我們可以抽象出一個(gè)用于添加方法的方法泻肯。

Function.prototype.addMethod = function (name, fn) {
    this[name] = fn;
}
var checkOut = new Function();
或者
var checkOut = function () {}
checkOut.addMethod('checkOutUserAccount',function () {
    //驗(yàn)證用戶賬戶
})

這里實(shí)例化了一個(gè)checkOut對(duì)象,這個(gè)對(duì)象調(diào)用原型上的addMethod方法時(shí)慰照,this[name] = fn中的this指向checkOut這個(gè)調(diào)用的對(duì)象灶挟,就相當(dāng)于是給checkOut這個(gè)對(duì)象添加了一個(gè)方法。例子中添加的是checkOutUserAccount方法毒租。

如果想要實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用就在原型addMethod中加入return this;

Function.prototype.addMethod = function (name, fn) {
    this[name] = fn;
    return this;
}

如何調(diào)用:

checkOut.addMethod('yourFun',function () {
  
}).addMethod('yourFun',function () {
  
}).addMethod('yourFun',function () {
  
})

如果想要對(duì)已添加的方法鏈?zhǔn)秸{(diào)用

checkOut.addMethod('yourFun',function () {
    // 這里return this  返回調(diào)用的對(duì)象  此時(shí)調(diào)用對(duì)象是 checkOut
    return this;
}).addMethod('yourFun',function () {
    // 這里return this  返回調(diào)用的對(duì)象  此時(shí)調(diào)用對(duì)象是 checkOut
    return this;
}).addMethod('yourFun',function () {
    // 這里return this  返回調(diào)用的對(duì)象  此時(shí)調(diào)用對(duì)象是 checkOut
    return this;
})

如何調(diào)用:(假設(shè)已經(jīng)添加了checkOutUserAccount 稚铣,checkOutUserEmail ,checkOutUserMobile這三個(gè)方法)

checkOut.checkOutUserAccount(). checkOutUserEmail().checkOutUserMobile() 

7.在checkOut的原型上添加方法的方法
當(dāng)然也可以在checkOut的原型上添加方法墅垮,(上面這種是在自身添加)
這里對(duì)addMethod做一個(gè)小修改

Function.prototype.addMethod = function (name, fn) {
    this.prototype[name] = fn;//在調(diào)用者的原型上添加方法
    return this;
}

但是這里調(diào)用的時(shí)候需要new 一個(gè)新的checkOut對(duì)象

var newCheckOut = new checkOut();
newCheckOut.checkOutUserAccount()

如果有誤惕医,或者有爭(zhēng)議的地方,提醒下算色,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抬伺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灾梦,更是在濱河造成了極大的恐慌峡钓,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斥废,死亡現(xiàn)場(chǎng)離奇詭異椒楣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)牡肉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淆九,“玉大人统锤,你說(shuō)我怎么就攤上這事√棵恚” “怎么了饲窿?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)焕蹄。 經(jīng)常有香客問(wèn)我逾雄,道長(zhǎng),這世上最難降的妖魔是什么腻脏? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任鸦泳,我火速辦了婚禮,結(jié)果婚禮上永品,老公的妹妹穿的比我還像新娘做鹰。我一直安慰自己,他們只是感情好鼎姐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布钾麸。 她就那樣靜靜地躺著更振,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭尝。 梳的紋絲不亂的頭發(fā)上肯腕,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音钥平,去河邊找鬼乎芳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帖池,可吹牛的內(nèi)容都是我干的奈惑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼睡汹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肴甸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起囚巴,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤原在,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后彤叉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體庶柿,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年秽浇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浮庐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柬焕,死狀恐怖审残,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斑举,我是刑警寧澤搅轿,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站富玷,受9級(jí)特大地震影響璧坟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赎懦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一雀鹃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铲敛,春花似錦褐澎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)迁酸。三九已至,卻和暖如春俭正,著一層夾襖步出監(jiān)牢的瞬間奸鬓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工掸读, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留串远,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓儿惫,卻偏偏與公主長(zhǎng)得像澡罚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肾请,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品留搔,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式铛铁。簡(jiǎn)單...
    舟漁行舟閱讀 7,769評(píng)論 2 17
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理隔显,服務(wù)發(fā)現(xiàn),斷路器饵逐,智...
    卡卡羅2017閱讀 134,661評(píng)論 18 139
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象括眠,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建倍权,需要時(shí)才創(chuàng)建 最常見(jiàn)的單例模式掷豺,...
    Obeing閱讀 2,073評(píng)論 1 10
  • 《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》作者:曾探 系統(tǒng)的介紹了各種模式,以及js中的實(shí)現(xiàn)账锹、應(yīng)用萌业,以及超大量高質(zhì)...
    undefinedR閱讀 814評(píng)論 0 10
  • 02301 崔愛(ài)萍 繪本一直以來(lái)是自己由衷熱愛(ài)的,而來(lái)參加繪本講師訓(xùn)練營(yíng)終于可以讓我把看到的好繪本“有身份”的推廣...
    Amy_53cf閱讀 360評(píng)論 0 1