自知其無知
          不懂,慢慢懂。
          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(); //調用了一個虛方法 
                }

           }
            

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


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

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

                  }

              );

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

             
          /*
                 一個神奇的解決方法: 
                 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);   // 產(chǎn)生錯誤,頁面沒有任何顯示.
                alert(333);
             
          */


          </script>
          posted on 2008-12-06 00:22 CopyHoo 閱讀(417) 評論(0)  編輯  收藏 所屬分類: JavaScript
          主站蜘蛛池模板: 资溪县| 西城区| 垫江县| 滨州市| 沾益县| 外汇| 边坝县| 泰顺县| 当雄县| 林口县| 沈丘县| 香格里拉县| 建阳市| 高台县| 巨鹿县| 淳安县| 济源市| 东至县| 泰州市| 滦南县| 吉林省| 南陵县| 五台县| 铁岭县| 白河县| 江津市| 泗洪县| 同仁县| 墨竹工卡县| 建水县| 汶上县| 额济纳旗| 会东县| 修武县| 黔东| 通州市| 大邑县| 沙田区| 和顺县| 襄城县| 南岸区|