herodby
          技術(shù) 筆記
          posts - 14,  comments - 14,  trackbacks - 0
          ???? 工廠模式:
          ????? 初級(jí)開(kāi)發(fā)者可能會(huì)這樣定義對(duì)象:
          ????? var? obj =? new Object();
          ?????? obj.name = "hero";
          ??????? obj.showName=function (){alert(this.name);}
          ????? 這里存在一個(gè)問(wèn)題就是如果我們要在多個(gè)地方用obj對(duì)象,可能在程序中類似的代碼要寫(xiě)好多遍,于是產(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);}
          ????????
          ?????? }

          ??
          ?把生成對(duì)象的代碼封裝起來(lái),避免出現(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");
          但是存在一個(gè)問(wèn)題,就是我們每次調(diào)用createObj函數(shù)都會(huì)創(chuàng)建新的函數(shù) showName.意味著每個(gè)對(duì)象都有自己版本的showName,所以要改進(jìn)避開(kāi)這個(gè)問(wè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ù)的問(wèn)題, 哈哈哈,大功告成 ,親一個(gè).
          ?????
          ????? 原型方式:
          ??????????主要是利用對(duì)象的prototype屬性.
          ???????? function obj()
          ???????? {}
          ???????? obj.prototype.name="hero";
          ???????? obj.prototype.showName=function()
          ???????? {
          ???????????????alert(this.name);
          ???????? }
          ???????? 看起來(lái)似乎比剛才的工廠還完美,但是 有一個(gè)問(wèn)題,該函數(shù)沒(méi)有構(gòu)造函數(shù),屬性是通過(guò)prototype指定的,這一點(diǎn)在實(shí)際應(yīng)用中很讓人頭疼,所有的實(shí)例的屬性都一樣實(shí)在是不能讓人接受.尤其還存在一個(gè)安全隱患,那就是當(dāng)對(duì)象中有引用時(shí),例如???加上這樣一段
          obj.prototype.nameArray = new Array("hero","dby");
          ?????? 然后
          ????????? obj1 = new obj();
          ????????? obj2 = new obj();
          ????????? obj1.nameArray.push("lxw");
          ????????? 在obj2的nameArray中將也會(huì)看到這個(gè)屬性,因?yàn)閮蓚€(gè)對(duì)象的nameArray指向的是同一個(gè)引用.
          ?????????? 所以這種方式并不是理想方法.
          ????需要 改進(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的值,不會(huì)影響到obj2對(duì)象的nameArray的值, 而且只有一個(gè)showName函數(shù),所以沒(méi)有內(nèi)存浪費(fèi).
          ??? 基本上完美了,剩下的基本都是一下其他的修飾了.有興趣的可以自己改著玩玩.
          ???? 筆者在這里加上一個(gè)單例 玩了一下:
          ???? 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";
          ??????????? }
          ???? }??
          ?????其實(shí)不算是單例,? 只不過(guò)是在構(gòu)造對(duì)象的時(shí)候,先判斷一個(gè)屬性是否被定義,如果沒(méi)有定義,那么用原型方法繼續(xù)定義對(duì)象,如果已經(jīng)定義了屬性,那么就不在重復(fù)定義函數(shù)了. 該prototype方法只被創(chuàng)建一次,病賦值一次.
          ??? 又差不多完美了,大功告成? ,再親一個(gè).



          ?????
          ???
          ???????
          posted on 2006-11-27 17:26 鄧兵野 閱讀(10870) 評(píng)論(3)  編輯  收藏 所屬分類: javascript

          FeedBack:
          # re: javascript對(duì)象定義方法
          2008-09-28 16:46 | hellen
          好經(jīng)典  回復(fù)  更多評(píng)論
            
          # re: javascript對(duì)象定義方法
          2008-12-17 14:05 | SharpBoy
          麻煩
          給你看段更經(jīng)典的 :
          <script type=text/javascript>

          var myTest={};//定義空間
          myTest.showname=function(code){
          myTest.name="hello world ";
          }
          //以上過(guò)程相當(dāng)于定義了個(gè)空間和對(duì)應(yīng)空間內(nèi)方法和屬性,這所以經(jīng)典以后如果應(yīng)用屬性和方法,不會(huì)再構(gòu)建對(duì)象,而且在應(yīng)用對(duì)象時(shí)也很方便

          //不過(guò)有個(gè)相同問(wèn)題 這個(gè)只能類似面向?qū)ο笾械撵o態(tài) 相對(duì)于你優(yōu)點(diǎn)在于參數(shù)傳遞和引用方便
          alert(myTest.showname("second Test"));

          </script>  回復(fù)  更多評(píng)論
            
          # re: javascript對(duì)象定義方法
          2010-04-29 09:43 | 柔柔弱弱
          對(duì)反反復(fù)反復(fù)反復(fù)反復(fù)反復(fù)反復(fù)反復(fù)  回復(fù)  更多評(píng)論
            

          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 徐州市| 承德市| 杭锦旗| 和林格尔县| 嘉黎县| 阿坝| 平乡县| 开封市| 天峨县| 信阳市| 唐河县| 松江区| 盐城市| 同心县| 筠连县| 江陵县| 南丰县| 城口县| 奉新县| 平塘县| 四子王旗| 罗甸县| 大兴区| 博白县| 本溪| 通州市| 姜堰市| 岳阳市| 子长县| 乳源| 凤翔县| 齐齐哈尔市| 海原县| 东乌珠穆沁旗| 乌拉特前旗| 康平县| 观塘区| 雷山县| 贵港市| 友谊县| 靖宇县|