OO
· 提高复用性,提高可维护性
· 可以使用各种成熟的设计模式

命名空间
    ·除了避免命名冲突,还有比较重要的就是能使程序员方便的找到他们所需要的类型和类,
      在开发中发现很多程序员命名空间的名字起的不知道什么意思,然后某个命名空间下的类
      的功能也不知道做什么用的,两种业务相关的类放在一个命名空间下,造成了代码的层次
      混乱,不方面以后维护。
      注册命名空间 Type.registerNamespace("Namespace");


    ·定义构造函数
         类的构造函数为function定义
         function myFunction(){}
         var myfun = new myFunction();
                  

    ·定义成员
         microsoft ajax library 面向对象类型系统将 get_ 和 set_ 开头的方法认作属性
         
        【code demo】:
         MyNamespace.Myclass = function(param1, ...) //定义构造函数
         {
            this._myProperty = null; 
         }
          //定义属性,方法成员 , 注意各个成员之间需要用逗号隔开,要不会出错
         MyNamespace.MyClass.prototype =
         {
            get_myProperty:function()
            {return this._myProperty;},

            set_myProperty:function(value)
            {this._myProperty=value;},

            methodName:function(){}
         }  
      

    ·注册类

        【code demo】:
         MyNamespace.Myclass = function(param1, ...)
         {
            //定义构造函数
         }
         MyNamespace.MyClass.prototype =
         {
            //定义属性,方法成员
         } 
         MyNamespace.MyClass.registerClass('MyNamespace.MyClass'); //注册类

使用Demo
    【code demo】:
     <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <script language="javascript" type="text/javascript">
       
        Type.registerNamespace("dongdeNamespace");
       
        dongdeNamespace.Worker = function(name)
        {
           this._name = name ? name:"(unknown)";
           this._bornyear = 0;
        }
       
        dongdeNamespace.Worker.prototype=
        {
           get_name:function()
           {
              return this._name;
           },
          
          
           get_bornyear:function()
           {
             
              return this._bornyear;
           },
           set_bornyear:function(value)
           {
              this._bornyear=value;
          
           },
          
          
           getAge:function()
           {
              return 2008-this._bornyear;
          
           },
          
           getWorkerDescript:function()
           {
             
              return String.format("{0}年龄:{1},出生于:{2}",this._name,this.getAge(),this.get_bornyear()); //不能去除this
           }     
       
        }
       
        dongdeNamespace.Worker.registerClass("dongdeNamespace.Worker");
       
       
        var worker = new dongdeNamespace.Worker("dongde");
        worker.set_bornyear(1981);    //这里注意为属性赋值的方式
        alert(  worker.getWorkerDescript() );
       
       
       
        </script>   

抽象类
     ·包含抽象方法的类为抽象类
     ·microsoft ajax library 面向对象类型系统 将包含运行后直接抛出异常的方法的类叫做抽象类,
       直接抛出异常的方法叫做抽象方法
    
     ·继承,调用父类的构造函数,有父类的类必须调用父类的构造函数(否侧会丢失继承效果)
       调用父亲类的构造函数语法 MyNamespace.MyClass.initializeBase(this,[param1,...]);
       [param1,...]参数 表示父类的构造函数的参数名,注意是参数名不是参数值

     ·注册时必须提供父类
       MyNamespace.MyClass.registerClass("MyNamespace.MyClass",MyNamespace.parentclass);

     ·定义同名的方法就可以覆盖父类的抽象方法

     ·toString方法无法继承,toString方法是javascript系统自带的一个方法,父类和子类作为对象都有toString方法,
       但是没有继承

     ·调用父类的方法 MyNamespace.MyClass.callBaseMethod(this,"MethodName",[param1,...]); //MethodName是父类的方法名
       this.MethodName();  //表示调用子类自己的MethodName方法
    

      【code demo】:
 
          <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <script language="javascript" type="text/javascript">
       
        Type.registerNamespace("dongdeNamespace");
       
        dongdeNamespace.Worker = function(name)
        {
           this._name = name ? name:"(unknown)";
           this._bornyear = 0;
        }
       
        dongdeNamespace.Worker.prototype=
        {
           get_name:function()
           {
              return this._name;
           },
          
          
           get_bornyear:function()
           {
             
              return this._bornyear;
           },
           set_bornyear:function(value)
           {
              this._bornyear=value;
          
           },
          
          
           getAge:function()
           {
              return 2008-this._bornyear;
          
           },
          
          
           getWorkerDescript:function()
           {
             
              return String.format("{0}年龄:{1},出生于:{2}",this._name,this.getAge(),this.get_bornyear());
           },   
       
           //抽象方法
           getSalary:function()
           {
              throw Error.notImplemented();
          
           }
        }
       
      
       
       
        /////////////////////////////////////////////////////////////////
        dongdeNamespace.Manager = function(name)
        {
           dongdeNamespace.Manager.initializeBase(this,[name]);
       
        }
       
        dongdeNamespace.Manager.prototype=
        {
           getSalary:function()
           {
              return 10000;
          
           }
       
        }
       
        //////////////////////////////////////////////////////////////////
        dongdeNamespace.AdvanceManager = function(name)
        {
           dongdeNamespace.AdvanceManager.initializeBase(this,[name]);
       
        }       
       
        dongdeNamespace.AdvanceManager.prototype=
        {
           getWorkerDescript:function()
           {
             
              return dongdeNamespace.AdvanceManager.callBaseMethod(this,"getWorkerDescript")+"我工资高吧";
           },
  
           getSalary:function()
           {
              return 18000;
          
           }         

       
        }
       
       
       
    
        dongdeNamespace.Manager.registerClass("dongdeNamespace.Manager",dongdeNamespace.Worker);   
       
        var worker = new dongdeNamespace.Manager("dongde");
        worker.set_bornyear(1981);
        alert(  worker.getWorkerDescript() +"工资:"+ worker.getSalary() );
       
       
       
        dongdeNamespace.AdvanceManager.registerClass("dongdeNamespace.AdvanceManager",dongdeNamespace.Worker); 
        var worker2 = new dongdeNamespace.AdvanceManager("dongde2");
        worker2.set_bornyear(1961);
        alert(  worker2.getWorkerDescript() +"工资:"+ worker2.getSalary() );
       
        </script>

----未完,请看续篇http://www.cnblogs.com/Brave-Heart/archive/2008/06/26/1230619.html

posted on 2008-06-25 17:37  dongde  阅读(489)  评论(1编辑  收藏  举报