????
工廠模式:
????? 初級開發(fā)者可能會這樣定義對象:
????? var? obj =? new Object();
?????? obj.name = "hero";
??????? obj.showName=function (){alert(this.name);}
????? 這里存在一個問題就是如果我們要在多個地方用obj對象,可能在程序中類似的代碼要寫好多遍,于是產(chǎn)生了工廠方法
?????? function createObj()
?????? {
????????????var obj =? new Object();
??????????? obj.name="hero";
??????????? obj.showName=function (){alert(this.name);}
??????????? return obj;
????? }
????? var obj1 = createObj();
????? var obj2 = createObj();
???? 和另外一種方法 構(gòu)造函數(shù)法
?????? function obj (name)
?????? {
?????????????? this.name=name;
????????????? ?this.showName=?function (){alert(this.name);}
????????
?????? }
??
?把生成對象的代碼封裝起來,避免出現(xiàn)重復(fù)new的代碼,當(dāng)然也可以進(jìn)一步改進(jìn),就是createObj傳遞一些參數(shù),而不是給obj賦默認(rèn)固定值:
??????????? function createObj(name)
?????? {
????????????var obj =? new Object();
??????????? obj.name=name;
??????????? obj.showName=function (){alert(this.name);}
??????????? return obj;
????? }
????? var obj1 = createObj("hero");
????? var o'b'j2=createObj("dby");
但是存在一個問題,就是我們每次調(diào)用createObj函數(shù)都會創(chuàng)建新的函數(shù) showName.意味著每個對象都有自己版本的showName,所以要改進(jìn)避開這個問題.
??????? function showName()
?????? {
?????????????? alert(this.name)
??????? }
????????function createObj(name)
?????? {
????????????var obj =? new Object();
??????????? obj.name=name;
??????????? obj.showName=showName;
??????????? return obj;
????? }
????
???????這樣就解決了 重復(fù)創(chuàng)建函數(shù)的問題, 哈哈哈,大功告成 ,親一個.
?????
????? 原型方式:
??????????主要是利用對象的prototype屬性.
???????? function obj()
???????? {}
???????? obj.prototype.name="hero";
???????? obj.prototype.showName=function()
???????? {
???????????????alert(this.name);
???????? }
???????? 看起來似乎比剛才的工廠還完美,但是 有一個問題,該函數(shù)沒有構(gòu)造函數(shù),屬性是通過prototype指定的,這一點在實際應(yīng)用中很讓人頭疼,所有的實例的屬性都一樣實在是不能讓人接受.尤其還存在一個安全隱患,那就是當(dāng)對象中有引用時,例如???加上這樣一段
obj.prototype.nameArray = new Array("hero","dby");
?????? 然后
????????? obj1 = new obj();
????????? obj2 = new obj();
????????? obj1.nameArray.push("lxw");
????????? 在obj2的nameArray中將也會看到這個屬性,因為兩個對象的nameArray指向的是同一個引用.
?????????? 所以這種方式并不是理想方法.
????需要 改進(jìn)?
????? 結(jié)合構(gòu)造函數(shù),在構(gòu)造函數(shù)定義屬性,用原型定義方法
????? 例如
????? fuction obj(name)
????? {
???????????? this.name = name
???????????? this.nameArray =?new Array("hero","dby");
????? }
????? obj.prototype.showName = function(){alert(this.name)}
所有的非函數(shù)屬性都在構(gòu)造函數(shù)里創(chuàng)建,函數(shù)屬性用prototype方式創(chuàng)建,obj1 中改變nameArray的值,不會影響到obj2對象的nameArray的值, 而且只有一個showName函數(shù),所以沒有內(nèi)存浪費.
??? 基本上完美了,剩下的基本都是一下其他的修飾了.有興趣的可以自己改著玩玩.
???? 筆者在這里加上一個單例 玩了一下:
???? function obj (name)
???? {
????????????this.name = name;
??????????? this.nameArray=new Array("hero","dby");
??????????? if(typeof? obj._initialized=='undefined')
????????????{
?????????????????????obj.prototype.showName=function(){alert(this.name);}
???????????????????? obj._initialized="true";
??????????? }
???? }??
?????其實不算是單例,? 只不過是在構(gòu)造對象的時候,先判斷一個屬性是否被定義,如果沒有定義,那么用原型方法繼續(xù)定義對象,如果已經(jīng)定義了屬性,那么就不在重復(fù)定義函數(shù)了. 該prototype方法只被創(chuàng)建一次,病賦值一次.
??? 又差不多完美了,大功告成? ,再親一個.
?????
???
???????
posted on 2006-11-27 17:26
鄧兵野 閱讀(10870)
評論(3) 編輯 收藏 所屬分類:
javascript