js中的開發(fā)模式進(jìn)化史:
js中有最初的只能由基本數(shù)據(jù)類型描述——》單例模式--》工廠模式--》構(gòu)造函數(shù)模式--》原型模式--》各個模式相結(jié)合的混合模式们豌,下面我會給大家逐一講解各個開發(fā)模式微峰;
第一次模式升級引用了對象數(shù)據(jù)類型:
對象數(shù)據(jù)類型的作用級好處:1蕴忆、分組,把描述同一個事物的所有屬性放在一起來描述,每一組都是一個單獨(dú)的個體(單獨(dú)的實(shí)例);
? ? ? ? 2惩系、避免沖突-每一個分組中都有自己的私有屬性及值,和其他分組不會產(chǎn)生沖突如筛。
var person ={
? ? name:"張松",
? ? age:26
}
var person1 = {
? ? ? ? name:"zys",
? ? ? ?age:26;
}
我們用以上對象把兩個個體實(shí)現(xiàn)了分組和獨(dú)立開堡牡,我們說每一個對象都是一個單獨(dú)的個體|實(shí)例 ? ?--這就是單例模式(就是一個普通的對象);person不僅叫對象名還可以叫做”命名空間“杨刨;
單例模式可以實(shí)現(xiàn)簡易的”模塊化開發(fā)“
2晤柄、工廠模式:
單例模式雖然實(shí)現(xiàn)了分組的作用,但是還是處于手工作業(yè)模式妖胀,為了增加生產(chǎn)的效率芥颈,實(shí)現(xiàn)批量生產(chǎn),就有了工廠模式赚抡;
工廠模式其實(shí)就是一個函數(shù)爬坑;
函數(shù)的封裝:把實(shí)現(xiàn)同一個功能的相同代碼放在一個函數(shù)中,以后再想實(shí)現(xiàn)這個功能的時候涂臣,我們只需要直接的執(zhí)行這個函數(shù)就可盾计,減少了頁面中的坑余代碼,提高代碼的重復(fù)使用率【低耦合高內(nèi)聚】
function ?sayHello(name){
? ?var obj={};
? ? obj.name = name;
obj.say= function(){ "Hello "+this.name};
return obj;
}
var person1 = sayHello("張松”)赁遗;
person1.say();
js中存在多態(tài)一詞署辉,多態(tài)指的是一個方法的多種形態(tài);
同一個方法根據(jù)執(zhí)行時傳遞參數(shù)的不同(值不同岩四、類型不同哭尝、參數(shù)數(shù)量不同)實(shí)現(xiàn)不一樣的功能的操作就叫做多態(tài)
functionsortAry(ary, type) {
varnewAry= ary.slice(0);
vartemp=null;
for(vari=0;i
for(varj=0;j
if(newAry[j] >newAry[j+1]) {
temp=newAry[j];
newAry[j] =newAry[j+1];
newAry[j+1] =temp;
}
}
}
//如果type沒有傳遞值小->大,傳遞了值就是大->小
typeoftype !=="undefined"?newAry.reverse() :null;
returnnewAry;
}
varary= [12,13,12,13,21,10];
console.log(sortAry(ary));
console.log(sortAry(ary,1));
3炫乓、構(gòu)造函數(shù):
構(gòu)造函數(shù)模式:通過new一個類來創(chuàng)建一個實(shí)例刚夺;
構(gòu)造函數(shù)模式和工廠模式的區(qū)別:
一般情況下献丑,我們?nèi)绻峭ㄟ^構(gòu)造函數(shù)來創(chuàng)建一個類的話末捣,我們的類名第一個字母要大寫侠姑,這不是規(guī)范,而是大家約定的一個規(guī)律箩做;
1莽红、在執(zhí)行時,構(gòu)造函數(shù)模式是通過 new Object()來執(zhí)行的邦邦,我們把Object稱之為一個類安吁,而通過類創(chuàng)建出來的結(jié)果(person)就是當(dāng)前類的一個實(shí)例;
2燃辖、類也是一個函數(shù)鬼店,所以也會像普通函數(shù)執(zhí)行一樣,形成私有的作用域黔龟,形參賦值妇智,預(yù)解釋,代碼從上到下執(zhí)行氏身;但是構(gòu)造函數(shù)模式在執(zhí)行之前巍棱,瀏覽器默認(rèn)會創(chuàng)建一個對象數(shù)據(jù)類型的值,并且會默認(rèn)的把這個對象數(shù)據(jù)類型的值進(jìn)行返回(不用自己手動的return返回了)
3蛋欣、把瀏覽器默認(rèn)創(chuàng)建的那個對象當(dāng)做當(dāng)前函數(shù)執(zhí)行的整體(this)然后通過this航徙。XXX這種方式給默認(rèn)創(chuàng)建的對象添加屬性和屬性值
瀏覽器默認(rèn)創(chuàng)建的這個對象其實(shí)就是我們當(dāng)前類的一個實(shí)例
在構(gòu)造函數(shù)模式創(chuàng)建一個類的時候,方法執(zhí)行陷虎,里面的this其實(shí)就是我們當(dāng)前類的一個實(shí)例
function SayHello(name){
? ?this.name = name;
this.say = function(){alert("Hello"+this.name)};
}
var p1 = new SayHello("張松“);
p1.say();
//類都是函數(shù)數(shù)據(jù)類型的
//console.log(typeof CreateJsPerson);//-->"function"
//類創(chuàng)建出來的實(shí)例都是對象數(shù)據(jù)類型的
//console.log(typeof p1);//-->"object"