自知其无知
不懂,慢慢懂。
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 阅读(412) 评论(0)  编辑  收藏 所属分类: JavaScript

只有注册用户登录后才能发表评论。


网站导航: