隨筆-9  評論-3  文章-0  trackbacks-0

          1. 偽類(Pseudoclassical)
          簡單的說,偽類就是通過定義一個構造函數并擴充它的prototype來實現的。

          <html>
          <head>
          <title>test</title>
          <script>
              
          function test(){
                  
          var Father = function(firstName){
                      
          this.firstName = firstName;
                  }
          ;

                  Father.prototype.name 
          = function(){
                      
          return this.firstName;
                  }
          ;

                  
          var Son = function(firstName, lastName){
                      
          this.firstName = firstName;
                      
          this.lastName = lastName;
                  }
          ;

                  Son.prototype 
          = new Father();

                  Son.prototype.name 
          = function(){
                      
          return this.firstName + " " + this.lastName;
                  }

                  
                  
          var aSon = new Son("San""Zhang");
                  alert(aSon.name()); 
          // San Zhang
              }

          </script>
          <body onload="test()">
          </body>
          </head>
          </html>


          可以看出,這種方法是沒有私有屬性的,并且不能訪問父類的方法。

          2. 原型(Prototypal)
          利用原型方式來實現繼承,就摒棄了偽類中向“類”這種方式靠攏的方法,而是用純粹的對象來實現。

          <html>
          <head>
          <title>test</title>
          <script>
              
          function test(){
                  
          var aFather = {
                      firstName: 
          "San",
                      lastName: 
          "Zhang",
                      getName: 
          function(){
                          
          return this.firstName + " " + this.lastName;
                      }

                  }
          ;

                  
          var Son = function(){};
                  Son.prototype 
          = aFather;

                  
          var aSon = new Son();
                  aSon.firstName 
          = "XiaoSan";
                  alert(aSon.getName()); 
          // XiaoSan Zhang
                  alert(Son.prototype.getName()); // San Zhang
              }

          </script>
          <body onload="test()">
          </body>
          </head>
          </html>


          可以看出,現在的繼承是純粹的對象與對象間的了,不過還有個問題,這個方式依然沒有解決屬性隱藏。

          3. 函數化(Functional)
          使用函數化方法可以通過閉包有效的實現信息隱藏,不過看起來就沒有原型方式直觀了。

          <html>
          <head>
          <title>test</title>
          <script>
              
          function test(){
                  
          var father = function(firstName, lastName){
                      
          var instance = {};

                      
          // 對外暴露的方法,此時firstName和lastName等于被隱藏了
                      instance.getFirstName = function(){
                          
          return firstName;
                      }
          ;

                      instance.getLastName 
          = function(){
                          
          return lastName;
                      }
          ;

                      instance.getName 
          = function(){
                          
          return firstName + " " + lastName;
                      }
          ;

                      
          return instance;
                  }
          ;
                  
                  
          var son = function(firstName, lastName){
                      
          // 這里就像OO語言一樣,先調用父類的構造函數
                      var instance = father(firstName, lastName);
                      
                      
          // 擴充方法,這里可以直接使用“父類”的方法,不過屬性已經變化了
                      instance.nickname = function(){
                          
          return "Little " + instance.getLastName();
                      }
          ;
                      
                      
          return instance;
                  }

                  
                  
          var aFather = father("San""Zhang");
                  
          var aSon = son("XiaoSan""Zhang");
                  alert(aFather.getName()); 
          // San Zhang
                  alert(aSon.getName()); // XiaoSan Zhang
                  alert(aSon.nickname()); // Litttle Zhang
              }

          </script>
          <body onload="test()">
          </body>
          </head>
          </html>
          posted on 2010-10-09 10:28 臭美 閱讀(277) 評論(0)  編輯  收藏 所屬分類: The Book of Eli

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 临朐县| 花垣县| 泽库县| 沅江市| 仲巴县| 女性| 贵阳市| 兴业县| 陵川县| 玉溪市| 临武县| 桑日县| 阿城市| 连云港市| 东乡| 长葛市| 仲巴县| 阿拉善左旗| 洱源县| 大连市| 陵川县| 准格尔旗| 邵阳市| 延长县| 宜章县| 常熟市| 滁州市| 平陆县| 卢龙县| 开阳县| 龙海市| 双鸭山市| 绥宁县| 新巴尔虎左旗| 息烽县| 三河市| 广汉市| 漠河县| 镇坪县| 嘉峪关市| 芜湖县|