待續(xù)http://www.cnblogs.com/ghostwu/p/7440691.html
總覺得我還沒有跨過這個(gè)坎挫酿,我得學(xué)好這個(gè)构眯。
工廠模式(最常看到的設(shè)計(jì)模式)
工廠模式的使用場(chǎng)合往往是要?jiǎng)?chuàng)建多個(gè)類似的對(duì)象早龟。
function createObj(name){
var obj = new Object();
obj.name = name;
obj.getName = function(){return obj.name};
return obj;
}
//使用方法
var obj1 = creatObj('Tony')
可以發(fā)現(xiàn)這種工廠模式產(chǎn)生的對(duì)象有著很大的局限性惫霸,不能設(shè)置和返回對(duì)象的類型。
為了讓創(chuàng)造出來的對(duì)象的類型也是可以獲取的葱弟,我們使用構(gòu)造函數(shù)的方法壹店。
function CreateObj(name){
this.name = name;
this.getName = function(){return this.name}
}
//利用的構(gòu)造函數(shù)建立實(shí)例的方法
var obj2= new CreateObj('pony')
上述的構(gòu)造函數(shù)的方法和工廠模式最大的區(qū)別就在于新建實(shí)例的方法,構(gòu)造函數(shù)使用的是new這個(gè)關(guān)鍵字芝加。在new之后硅卢,會(huì)默認(rèn)創(chuàng)造一個(gè)this,最后都會(huì)return this藏杖。
使用new出的實(shí)例将塑,就可以用instanceof判斷它的類型了。
組合設(shè)計(jì)模式
用到組合設(shè)計(jì)模式之前蝌麸,我們先了解下為什么要使用這一種的設(shè)計(jì)模式点寥。它又是針對(duì)什么模式的改進(jìn)。
要設(shè)計(jì)大量的相似的對(duì)象来吩,首先其實(shí)想到的可以是繼承啊敢辩。對(duì)于JavaScript就可以用到原型鏈蔽莱,就可以用原型鏈繼承啊。
function object(o){
var G = function(){};
G.prototype = o;
return new G;
}
//realize inherit
var obj = {'name':'tony',show:function(){console.log(this.name)}}
var obj1 = object(obj)
但是如果對(duì)obj1中的name屬性就行修改的話戚长,可以發(fā)現(xiàn)obj的name屬相也會(huì)被修改盗冷,應(yīng)該原型鏈實(shí)現(xiàn)的是淺拷貝,引用類型的數(shù)據(jù)在共同的實(shí)例中共享历葛。
其中正塌,原型鏈繼承的方法在ES5中新增了一個(gè)Object.create()的方法。同樣也是淺拷貝恤溶。
寄生式繼承
function objCreate(srcObj){
var det = Object.create(sercObj);
return det
}
var obj1 = {name:'yippee'}
var obj2 = objCreate(obj1)
將原型鏈繼承再次封裝乓诽。
這樣實(shí)現(xiàn)就是一個(gè)數(shù)據(jù)不同享的繼承了。
但是又發(fā)現(xiàn)咒程,這個(gè)還是不完美的鸠天,不能傳參數(shù)。
那么帐姻,就可以引出組合繼承了稠集。
大三下就開始看這些了,這都不知道是第幾次復(fù)習(xí)了饥瓷。但是總是感覺理解的火候差點(diǎn)
//組合繼承
function Person( uName ){
this.skills = [ 'php', 'javascript' ];
this.userName = uName;
}
Person.prototype.showUserName = function(){
return this.userName;
}
function Teacher ( uName ){
Person.call( this, uName );
}
Teacher.prototype = new Person();
var oT1 = new Teacher( 'ghostwu' );
oT1.skills.push( 'linux' );
var oT2 = new Teacher( 'ghostwu' );
console.log( oT2.skills ); //php,javascript
console.log( oT2.showUserName() ); //ghostwu
組合式繼承雖然在功能上大致的實(shí)現(xiàn)了我們的要求剥纷,但是在這種方法中調(diào)用了父類的構(gòu)造函數(shù)兩次,其中Persion.call(this.Uname)
實(shí)例化對(duì)象的時(shí)候調(diào)用了一次呢铆,又在Teacher.prototype = new Person()
設(shè)置子類原型的時(shí)候調(diào)用了一次晦鞋。
寄生組合式繼承
function Person(name){
this,name = name;
this.sex = 'male'
}
Persion.prototype.showName = function(){
return this.name;
}
function Teacher(name){
Person.call(this,name)
}
function inherit(sub,super){
var tem = OBject.creat('super');
tem . constructor = super;
sub.prototype = tem;
}
這個(gè)也就是再對(duì)父類淺拷貝。
自我邏輯大調(diào)整棺克,每次寫完了之后悠垛,經(jīng)常過個(gè)幾天再去回想這一塊代碼邏輯的時(shí)候,總是會(huì)出現(xiàn)混淆娜谊。
搞忘了到底是用的function 還是對(duì)象确买,對(duì)function中的this的指向也就會(huì)出現(xiàn)問題。
在這重新梳理一下邏輯纱皆。
用的就是function湾趾,不然所有的原型鏈從何而來。
只是其中為什么用到了this派草,就是因?yàn)閚ew關(guān)鍵字撑帖。會(huì)自動(dòng)創(chuàng)建并且返回一個(gè)對(duì)象。
如果直接使用function澳眷,其中的this指向的是window。
這只是簡(jiǎn)單的了解了一下了思路蛉艾,然而在實(shí)際中的運(yùn)用還需要大量的練習(xí)
學(xué)習(xí)內(nèi)容恐有錯(cuò)誤钳踊,日后若是有感觸重新改正