掐指一算脱衙,再過幾天我做前端就滿三年了侥猬。日子真的不耐過,時(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è)方法迈喉,用于處理這種特殊的情況绍刮。