javascript設(shè)計(jì)模式概述

掐指一算脱衙,再過幾天我做前端就滿三年了侥猬。日子真的不耐過,時(shí)間過去
了捐韩,但是自我感覺技術(shù)還是很low退唠,頁面可以畫、業(yè)務(wù)可以做荤胁、組件可以封
裝等等瞧预,但是我感覺我思想上還處于一個(gè)很初級(jí)的水平,很想掙脫這種困
境仅政。最近重新學(xué)習(xí)一遍張容銘的javascript設(shè)計(jì)模式垢油,希望對(duì)自己能有所提
升。為了讓我的學(xué)習(xí)留下一點(diǎn)痕跡已旧,更重要的是擔(dān)心看了就忘秸苗,所以,就記
錄一下學(xué)習(xí)的過程以及在學(xué)的過程中自己的一些領(lǐng)悟运褪。
開始吧,希望自己能堅(jiān)持下來玖瘸!

一秸讹、函數(shù)直接聲明

function checkName(){
    //驗(yàn)證姓名
}
function checkEmail(){
    //驗(yàn)證郵箱
}
function checkPassword(){
    //驗(yàn)證密碼
}
使用直接聲明方式定義函數(shù),容易造成全局變量的污染雅倒,如果是團(tuán)隊(duì)合作
容易造成代碼的覆蓋璃诀。不建議使用。

二蔑匣、函數(shù)表達(dá)式聲明

var checkName =  function (){
    //驗(yàn)證姓名
}
var checkEmail = function (){
    //驗(yàn)證郵箱
}
var checkPassword = function (){
    //驗(yàn)證密碼
}
函數(shù)表達(dá)式方式定義變量跟函數(shù)直接聲明差不多劣欢,也聲明了3個(gè)全局 變
量,造成了全局的污染裁良,容易覆蓋代碼凿将,不建議使用。

三价脾、對(duì)象收編變量(1)

var  checkObject = {
    checkName: function (){
        //驗(yàn)證姓名
    },
    checkEmail : function (){
        //驗(yàn)證郵箱
    },
    checkPassword : function (){
        //驗(yàn)證密碼
    }
    
}
checkObject.checkName()
使用一個(gè)對(duì)象承載所有的方法和屬性牧抵,使用方法時(shí),通過點(diǎn)語法實(shí)現(xiàn)調(diào)用

四侨把、對(duì)象收編變量(2)

var checkObject = function(){}
checkObject.checkName = function(){}
checkObject.checkEmail = function(){}
checkObject.checkPassword = function(){}

var aa = checkObject ()
aa.checkName()

如果其他人也許使用checkName這樣的方法犀变,但是調(diào)用checkObject函
數(shù),對(duì)應(yīng)的方法是不能繼承下來秋柄。所以我們學(xué)習(xí)下一種方法获枝。

五、對(duì)象的返回實(shí)現(xiàn)方法的“繼承”

var checkObject = function(){
    return{
        checkName:function(){

        },
        checkEmail:function(){

        },
        checkPassword:function(){

        }
    }
}
var aa = checkObject()
aa.checkName()

這里所說的繼承不是真正意義上的繼承骇笔,只是簡(jiǎn)單的通過調(diào)用函數(shù)返回所有的方法省店。

六机隙、構(gòu)造函數(shù)的方式實(shí)現(xiàn)方法的“繼承”

var checkObject = function(){
   this.checkName = function(){

   }
   this.checkEmail = function(){

   }
   this.checkPassword = function(){
       
   }
   
}
var aa = new checkObject()
aa.checkName()
所有的方法都綁定到this上,每次通過new的方式創(chuàng)建一個(gè)實(shí)例萨西,都會(huì)重新
創(chuàng)建一個(gè)新的對(duì)象有鹿,新的對(duì)象都會(huì)對(duì)this上的屬性、方法實(shí)現(xiàn)復(fù)制谎脯,然而
這樣做是很消耗的葱跋,我們可以做進(jìn)一步優(yōu)化

七、使用prototype實(shí)現(xiàn)繼承

var CheckObject = function(){}
CheckObject.prototype.checkName = function(){}
CheckObject.prototype.checkEmail = function(){}
CheckObject.prototype.checkPassword = function(){}

 var aa = new CheckObject()
 aa.checkName()

把方法注冊(cè)到構(gòu)造函數(shù)的prototype原型上源梭,就不會(huì)每次new 出來的實(shí)例把
構(gòu)造函數(shù)的方法復(fù)制到新的實(shí)例對(duì)象上娱俺,實(shí)例的方法都是指向同一個(gè),
即為構(gòu)造函數(shù)的原型

還可以用以上的形式來寫:
var CheckObject = function(){}
 CheckObject.prototype = {
     checkName:function(){},
     checkName:function(){},
     checkPassword:function(){}

 }
 var aa = new CheckObject()
 aa.checkName()

這里要注意一點(diǎn)废麻,2種方法不能混著寫荠卷,后一種方法相當(dāng)是重寫了構(gòu)造函
數(shù)的prototype屬性,也會(huì)把他之前默認(rèn)的方法烛愧,屬性覆蓋油宜。

八、實(shí)現(xiàn)鏈?zhǔn)骄幊?/p>

var CheckObject = function(){}
 CheckObject.prototype = {
     checkName:function(){
         return this
     },
     checkName:function(){
        return this
     },
     checkPassword:function(){
        return this
     }

 }
 var aa = new CheckObject()
 aa.checkName().checkEmail().checkPassword()
在方法的最后返回當(dāng)前調(diào)用的實(shí)例this怜姿,就可以實(shí)現(xiàn)鏈?zhǔn)骄幊汤玻?

九慎冤、動(dòng)態(tài)添加屬性或方法

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

 var methods = function(){}
//  或者
 var methods = new Function()
 methods.addMethod('checkName',function(){

 })
 methods.checkName()

給Function的prototype抽象出一個(gè)統(tǒng)一的方法,用來給實(shí)例添加方法或者
屬性沧卢,這樣一來蚁堤,就可以很方便添加定制化的方法啦。


這個(gè)方法我覺得特別有用但狭,比如某天我封裝了一個(gè)牛逼轟轟的插件披诗,適應(yīng)
大多數(shù)的情況。突然有一天立磁,某種情況下需要有一個(gè)特別的處理呈队,但是此
時(shí)如果要對(duì)這種特別的情況進(jìn)行處理,還要對(duì)原來的代碼進(jìn)行各種騷操作
的適配息罗,這種做法是很難受的掂咒。如果我給這個(gè)類暴露一個(gè)用于添加方法或
屬性的方法,我們就可以add一個(gè)方法迈喉,用于處理這種特殊的情況绍刮。




?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挨摸,隨后出現(xiàn)的幾起案子孩革,更是在濱河造成了極大的恐慌,老刑警劉巖得运,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膝蜈,死亡現(xiàn)場(chǎng)離奇詭異锅移,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饱搏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門非剃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人推沸,你說我怎么就攤上這事备绽。” “怎么了鬓催?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵肺素,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我宇驾,道長(zhǎng)倍靡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任课舍,我火速辦了婚禮塌西,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘布卡。我一直安慰自己雨让,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布忿等。 她就那樣靜靜地躺著,像睡著了一般崔挖。 火紅的嫁衣襯著肌膚如雪贸街。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天狸相,我揣著相機(jī)與錄音薛匪,去河邊找鬼。 笑死脓鹃,一個(gè)胖子當(dāng)著我的面吹牛逸尖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘸右,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼娇跟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了太颤?” 一聲冷哼從身側(cè)響起苞俘,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎龄章,沒想到半個(gè)月后吃谣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乞封,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年岗憋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肃晚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仔戈,死狀恐怖关串,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杂穷,我是刑警寧澤悍缠,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站耐量,受9級(jí)特大地震影響飞蚓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜廊蜒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一趴拧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧山叮,春花似錦著榴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锐借,卻和暖如春问麸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞翔。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工严卖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人布轿。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓哮笆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汰扭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稠肘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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