<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    herodby
    技術 筆記
    posts - 14,  comments - 14,  trackbacks - 0
    ???? 工廠模式:
    ????? 初級開發者可能會這樣定義對象:
    ????? var? obj =? new Object();
    ?????? obj.name = "hero";
    ??????? obj.showName=function (){alert(this.name);}
    ????? 這里存在一個問題就是如果我們要在多個地方用obj對象,可能在程序中類似的代碼要寫好多遍,于是產生了工廠方法
    ?????? function createObj()
    ?????? {
    ????????????var obj =? new Object();
    ??????????? obj.name="hero";
    ??????????? obj.showName=function (){alert(this.name);}
    ??????????? return obj;
    ????? }
    ????? var obj1 = createObj();
    ????? var obj2 = createObj();
    ???? 和另外一種方法 構造函數法
    ?????? function obj (name)
    ?????? {
    ?????????????? this.name=name;
    ????????????? ?this.showName=?function (){alert(this.name);}
    ????????
    ?????? }

    ??
    ?把生成對象的代碼封裝起來,避免出現重復new的代碼,當然也可以進一步改進,就是createObj傳遞一些參數,而不是給obj賦默認固定值:
    ??????????? 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");
    但是存在一個問題,就是我們每次調用createObj函數都會創建新的函數 showName.意味著每個對象都有自己版本的showName,所以要改進避開這個問題.
    ??????? function showName()
    ?????? {
    ?????????????? alert(this.name)
    ??????? }
    ????????function createObj(name)
    ?????? {
    ????????????var obj =? new Object();
    ??????????? obj.name=name;
    ??????????? obj.showName=showName;
    ??????????? return obj;
    ????? }
    ????
    ???????這樣就解決了 重復創建函數的問題, 哈哈哈,大功告成 ,親一個.
    ?????
    ????? 原型方式:
    ??????????主要是利用對象的prototype屬性.
    ???????? function obj()
    ???????? {}
    ???????? obj.prototype.name="hero";
    ???????? obj.prototype.showName=function()
    ???????? {
    ???????????????alert(this.name);
    ???????? }
    ???????? 看起來似乎比剛才的工廠還完美,但是 有一個問題,該函數沒有構造函數,屬性是通過prototype指定的,這一點在實際應用中很讓人頭疼,所有的實例的屬性都一樣實在是不能讓人接受.尤其還存在一個安全隱患,那就是當對象中有引用時,例如???加上這樣一段
    obj.prototype.nameArray = new Array("hero","dby");
    ?????? 然后
    ????????? obj1 = new obj();
    ????????? obj2 = new obj();
    ????????? obj1.nameArray.push("lxw");
    ????????? 在obj2的nameArray中將也會看到這個屬性,因為兩個對象的nameArray指向的是同一個引用.
    ?????????? 所以這種方式并不是理想方法.
    ????需要 改進?
    ????? 結合構造函數,在構造函數定義屬性,用原型定義方法
    ????? 例如
    ????? fuction obj(name)
    ????? {
    ???????????? this.name = name
    ???????????? this.nameArray =?new Array("hero","dby");
    ????? }
    ????? obj.prototype.showName = function(){alert(this.name)}
    所有的非函數屬性都在構造函數里創建,函數屬性用prototype方式創建,obj1 中改變nameArray的值,不會影響到obj2對象的nameArray的值, 而且只有一個showName函數,所以沒有內存浪費.
    ??? 基本上完美了,剩下的基本都是一下其他的修飾了.有興趣的可以自己改著玩玩.
    ???? 筆者在這里加上一個單例 玩了一下:
    ???? 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";
    ??????????? }
    ???? }??
    ?????其實不算是單例,? 只不過是在構造對象的時候,先判斷一個屬性是否被定義,如果沒有定義,那么用原型方法繼續定義對象,如果已經定義了屬性,那么就不在重復定義函數了. 該prototype方法只被創建一次,病賦值一次.
    ??? 又差不多完美了,大功告成? ,再親一個.



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

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

    var myTest={};//定義空間
    myTest.showname=function(code){
    myTest.name="hello world ";
    }
    //以上過程相當于定義了個空間和對應空間內方法和屬性,這所以經典以后如果應用屬性和方法,不會再構建對象,而且在應用對象時也很方便

    //不過有個相同問題 這個只能類似面向對象中的靜態 相對于你優點在于參數傳遞和引用方便
    alert(myTest.showname("second Test"));

    </script>  回復  更多評論
      
    # re: javascript對象定義方法
    2010-04-29 09:43 | 柔柔弱弱
    對反反復反復反復反復反復反復反復  回復  更多評論
      

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

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 8888四色奇米在线观看免费看| 全黄A免费一级毛片| 在线人成精品免费视频| 亚洲国产AV无码专区亚洲AV | 亚洲JIZZJIZZ妇女| 最近免费中文字幕视频高清在线看 | 久久精品国产精品亚洲蜜月| 99在线免费观看| 亚洲av无码一区二区三区乱子伦| 中文在线观看免费网站| 亚洲人色婷婷成人网站在线观看| 成人无码区免费A∨直播| 亚洲成AV人在线播放无码| 69精品免费视频| 亚洲午夜精品一区二区公牛电影院| 在线视频观看免费视频18| 亚洲精品无播放器在线播放| mm1313亚洲精品国产| 精品一区二区三区免费观看| 久久久久久a亚洲欧洲aⅴ| 最近中文字幕免费mv在线视频| 亚洲一级大黄大色毛片| 四虎成人免费观看在线网址| 日韩a毛片免费观看| 久久亚洲国产精品| 永久免费AV无码国产网站| 黄色一级毛片免费| 亚洲Aⅴ无码专区在线观看q| 国产免费不卡v片在线观看| 男男黄GAY片免费网站WWW | 亚洲精品高清国产一久久| 免费看国产精品3a黄的视频| 在线观看亚洲网站| 久久亚洲精品国产精品黑人| 97无码免费人妻超级碰碰碰碰 | 水蜜桃视频在线观看免费播放高清| 亚洲丝袜美腿视频| 国产男女性潮高清免费网站| 免费日本一区二区| 亚洲成AV人片高潮喷水| 亚洲AV综合色区无码一区|