javascript對象定義方法

          Posted on 2008-09-05 15:52 H2O 閱讀(255) 評論(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方法只被創建一次,病賦值一次.

          posts - 0, comments - 21, trackbacks - 0, articles - 101

          Copyright © H2O

          主站蜘蛛池模板: 德阳市| 邻水| 桑植县| 筠连县| 山东省| 邵阳县| 高清| 平顶山市| 璧山县| 晋中市| 静安区| 烟台市| 绥化市| 新乡市| 桂东县| 正阳县| 谷城县| 灵璧县| 沙河市| 琼结县| 武宁县| 虹口区| 托里县| 弥勒县| 建湖县| 疏附县| 华安县| 广宗县| 大姚县| 西乌珠穆沁旗| 蕲春县| 麟游县| 潞城市| 郓城县| 青河县| 象山县| 平潭县| 全南县| 永修县| 明溪县| 沛县|