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

          javascript對象定義方法 [轉]

          ???? 工廠模式:
          ????? 初級開發(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();
          ???? 和另外一種方法 構造函數(shù)法
          ?????? function obj (name)
          ?????? {
          ?????????????? this.name=name;
          ????????????? ?this.showName=?function (){alert(this.name);}
          ????????
          ?????? }

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

          posted on 2006-12-08 00:42 mlw2000 閱讀(205) 評論(0)  編輯  收藏 所屬分類: JavaScript

          主站蜘蛛池模板: 彰化县| 眉山市| 沁源县| 巨鹿县| 丰原市| 金昌市| 克拉玛依市| 天门市| 绥宁县| 深圳市| 扶余县| 浑源县| 平谷区| 平度市| 辽中县| 名山县| 连平县| 翁牛特旗| 鄂尔多斯市| 汕头市| 法库县| 芦山县| 延长县| 聂拉木县| 合川市| 遵化市| 墨竹工卡县| 社旗县| 庆城县| 河北区| 卢湾区| 蒙山县| 从化市| 广南县| 琼中| 那曲县| 修水县| 赣州市| 班玛县| 池州市| 伊金霍洛旗|