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

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

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

    隨筆 - 14, 文章 - 39, 評論 - 17, 引用 - 0
    數據加載中……

    javascript對象定義方法 [轉]

    ???? 工廠模式:
    ????? 初級開發者可能會這樣定義對象:
    ????? 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-12-08 00:42 mlw2000 閱讀(210) 評論(0)  編輯  收藏 所屬分類: JavaScript

    主站蜘蛛池模板: 亚洲日本国产乱码va在线观看| www国产亚洲精品久久久| 亚洲高清专区日韩精品| 一级人做人爰a全过程免费视频| 成年午夜视频免费观看视频| 色在线亚洲视频www| 1000部国产成人免费视频| 亚洲综合色丁香麻豆| 131美女爱做免费毛片| 国产成人精品日本亚洲专| 免费一本色道久久一区| 亚洲国产精品成人午夜在线观看 | 久草在视频免费福利| 亚洲中文无码av永久| 成人毛片18女人毛片免费96| 亚洲国产精品无码第一区二区三区 | 久久综合日韩亚洲精品色| 无码一区二区三区免费| 亚洲精品国产福利片| 好爽又高潮了毛片免费下载| 婷婷国产偷v国产偷v亚洲| 久久久久一级精品亚洲国产成人综合AV区| 成人妇女免费播放久久久| 亚洲精品国产成人专区| aa级一级天堂片免费观看| 美女扒开屁股让男人桶爽免费 | 91成人免费观看| 亚洲一区二区无码偷拍| 亚洲av片一区二区三区| 成全动漫视频在线观看免费高清版下载| 久久精品国产亚洲AV果冻传媒| 久9久9精品免费观看| 亚洲性色AV日韩在线观看| 一本色道久久88综合亚洲精品高清| 国产高清视频免费在线观看| 亚洲色图古典武侠| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲日本乱码卡2卡3卡新区| 日韩亚洲国产二区| 9277手机在线视频观看免费| 成人婷婷网色偷偷亚洲男人的天堂|