自知其無知
          不懂,慢慢懂。
          posts - 2,comments - 2,trackbacks - 0


          <script type="text/javascript">



             Object.extend 
          = function (destination,source){
                  
                  
          for(property in source){
                      alert(source[property]);
                      destination[property] 
          = source[property];
                  }
                  

                  
          return destination;
             }


             Object.prototype.extend 
          = function (object){
                
          return Object.extend.apply(this,[this,object]);
             }


           
          function base(){}
              
           base.prototype
          ={
                initialize:
          function(){
                         
          this.oninit(); //調用了一個虛方法 
                }

           }
            

              
          /* 
                 如果要讓下面的代碼繼續運行,那么這一句必須被注釋掉,也就是我們的 base 類添加了這個方法后,
                 class1 在進行 extend (繼承) 時,會報錯。為什么?
               
          */
                
               
              base.prototype.oninit 
          = function (){
                  alert('方法 oninit() 被調用');
              }


              
              
          var base = new base(); // base 被實例化了(關鍵點是,只要在調用的時候,oninit()方法被定義出來了就行!)
              base.oninit();
              
          /* */
              
          // 讓一個 class 繼承于 base 并實現其中的 oninit 方法

              
          function class1(){}
           
              class1.prototype 
          = (new base()).extend(
                  
          {
                      oninit : 
          function (){  // 實現抽象基類的 oninit 虛方法           
                              // oninit 函數實現
                      }

                  }

              );

            
          // 問題: 為什么 base 中定義了,并實現了 oninit 方法后,進行 繼承后,會產生錯誤?
            /*
               當然從語義上面來講,繼承后,肯定是對抽象方法的實現。但是,為什么語法上有這個限制,
               而且,我們應該知道,子類是可以對父類方法進行重寫的。或許有人站出來說,我將 java 與 js 
               弄混淆了,但是,請注意,我這只是為了發現問題,請告訴我,為什么?
            
          */
           
             

             
          /*
                 一個神奇的解決方法: 
                 1. 用 editplus 打開
                 2. 找到 var base = new base(); 這個標準的在39 行 以及 base.oninit();
                 3. 將 變量 base 改為 任何其他的變量,比如:
                    var ba = new base(); ba.oninit();

                問題解決完畢!!
                也就是說, js 是首先搜索當前作用域對象的變量,然后再查找方法塊的!!!
                比如先查找  window.base 變量,再查找 window.base() 方法,
                這樣的話,
                下面的 class1.prototype = (new base()).extend{
                      
                }
                這里的 new base() 就是先將 base 當做變量,而不是方法!!!

                關于這個問題,我們可以做一個簡單的測試!
               
                var alert = alert(123);   // 產生錯誤,頁面沒有任何顯示.
                alert(333);
             
          */


          </script>
          posted on 2008-12-06 00:22 CopyHoo 閱讀(417) 評論(0)  編輯  收藏 所屬分類: JavaScript
          主站蜘蛛池模板: 乌什县| 旬阳县| 禹州市| 泗水县| 万州区| 徐州市| 津市市| 陈巴尔虎旗| 五华县| 荔波县| 沙湾县| 灌云县| 化州市| 沅江市| 洪雅县| 清丰县| 昆明市| 花垣县| 绥滨县| 威宁| 通道| 永平县| 义马市| 天祝| 民权县| 泽库县| 平江县| 晋州市| 四会市| 涿州市| 抚州市| 安塞县| 承德市| 黄山市| 剑阁县| 永登县| 阿拉善盟| 东平县| 确山县| 政和县| 黄冈市|