Ajax 面向对象类型系统

时间:2022-03-26 18:35:09

1、注册命名空间

命名空间在.Net中非常常见,为了避免类型冲突,并将类进行分类识别。在Asp.Net Ajax中也有命名控件的概念,通过使用Type.registerNamespace("SpaceName") 来注册一个命名空间。

2、类

类的构造函数就是function的定义。通常类的私有成员使用_开头,但是这仅仅只是标识这个成员是私有的,不能做到真正的封装,外部还是可以访问当这个内部成员。类的内部成员不用声明,直接可以在函数中使用。

Ajax 面向对象类型系统MyNamespace.Employee  =   function (name)
Ajax 面向对象类型系统Ajax 面向对象类型系统
... {
Ajax 面向对象类型系统    
this._name = name ? name : "[Anonymous]";
Ajax 面向对象类型系统    
this._year = 0;
Ajax 面向对象类型系统}

上面这段代码就是Employee类的构造函数。

定义类的方法:在Asp.Net Ajax是,定义类的成员方法是基于prototype的定义

Ajax 面向对象类型系统MyNamespace.Employee.prototype  =  
Ajax 面向对象类型系统Ajax 面向对象类型系统
... {
Ajax 面向对象类型系统    get_name : 
function()
Ajax 面向对象类型系统Ajax 面向对象类型系统    
...{
Ajax 面向对象类型系统        
return this._name;
Ajax 面向对象类型系统    }
,
Ajax 面向对象类型系统    
Ajax 面向对象类型系统    get_year : 
function()
Ajax 面向对象类型系统Ajax 面向对象类型系统    
...{
Ajax 面向对象类型系统        
return this._year;
Ajax 面向对象类型系统    }
,
Ajax 面向对象类型系统    set_year : 
function(value)
Ajax 面向对象类型系统Ajax 面向对象类型系统    
...{
Ajax 面向对象类型系统        
this._year = value;
Ajax 面向对象类型系统    }
,
Ajax 面向对象类型系统    
Ajax 面向对象类型系统    calculateSalary : 
function()
Ajax 面向对象类型系统Ajax 面向对象类型系统    
...{
Ajax 面向对象类型系统        
throw Error.notImplemented();
Ajax 面向对象类型系统    }
,
Ajax 面向对象类型系统    
Ajax 面向对象类型系统    getDescription : 
function()
Ajax 面向对象类型系统Ajax 面向对象类型系统    
...{
Ajax 面向对象类型系统        
return String.format(
Ajax 面向对象类型系统            
"{0} gets {1} yuan per month.",
Ajax 面向对象类型系统            
this._name,
Ajax 面向对象类型系统            
this.calculateSalary());
Ajax 面向对象类型系统    }

Ajax 面向对象类型系统}

如例所示,定义类的方法,需要使用命名空间名加类名加prototype,每个方法之间一定要用','分割。注意在js中set_、get_开头的方法作为一个类的属性。

在定义完类和类的方法之后需要注册类,使用NameSpace.ClassName.registerClass("NameSpace.ClassName")来注册一个类,注意命名空间需要注册在这个之前。

3、实现面向对象的特性-继承

  • 抽象类:抽象类就是包含抽象方法的类,那么在Asp.Net Ajax中如何来表明一个抽象方法呢?那么在实现类的方法的时候,不写出方法的逻辑,直接抛出一个Error.notImplemented()错误,如上例calculateSalary 方法就是一个抽象方法。
  • 继承:如果一个类继承了另一个类,那么必须调用基类的构造函数,否则会丢失继承效果。
    Ajax 面向对象类型系统nameSpace.DividedClass  =  function()
    Ajax 面向对象类型系统Ajax 面向对象类型系统
    ... {
    Ajax 面向对象类型系统    nameSpace.DividedClass.initializeBase(
    this, [param1, ...]);
    Ajax 面向对象类型系统}
  • 注册派生类:在注册类时,需要加上基类的名作为第二个参数来表明派生类和基类之间的继承关系nameSpace.DividedClass.registerClass("nameSpace.DividedClass", BaseClassNameSpace.BaseClass);
  • 直接用普通方式实现父类的抽象成员。toString()方法无法被继承
  • 派生类调用基类的方法

           如果要在派生类里调用基类的方法需要使用callBaseMethod方法,具体的调用方法如下

Ajax 面向对象类型系统var  description  =  MyNamespace.Intern.callBaseMethod( this " getDescription " " hello " " world " );

第一个参数为this指针,第二个参数为基类的方法名,后面的参数为激励方法的参数,是一个不定参数。

  • 接口:接口与注册类的方式相同,但是构造函数和所有的方法抛出异常,表明是一个抽象方法。注册时使用registerInterface方法。注意:接口无法继承其他接口,并且由于js时弱类型语言,那么接口只是标记作用,只是在反射方法中反映出效果
    Ajax 面向对象类型系统MyNamespace.IEmployee  =   function ()
    Ajax 面向对象类型系统Ajax 面向对象类型系统
    ... {
    Ajax 面向对象类型系统    
    throw Error.notImplemented();
    Ajax 面向对象类型系统}

    Ajax 面向对象类型系统MyNamespace.IEmployee.prototype 
    =  
    Ajax 面向对象类型系统Ajax 面向对象类型系统
    ... {
    Ajax 面向对象类型系统    calcaulateSalary : 
    function()
    Ajax 面向对象类型系统Ajax 面向对象类型系统    
    ...{
    Ajax 面向对象类型系统        
    throw Error.notImplemented();
    Ajax 面向对象类型系统    }
    ,
    Ajax 面向对象类型系统    
    Ajax 面向对象类型系统    get_type : 
    function()
    Ajax 面向对象类型系统Ajax 面向对象类型系统    
    ...{
    Ajax 面向对象类型系统        
    throw Error.notImplemented();
    Ajax 面向对象类型系统    }

    Ajax 面向对象类型系统}

    Ajax 面向对象类型系统MyNamespace.IEmployee.registerInterface(
    " MyNamespace.IEmployee " );
  • 如何实现接口:在使用registerClass方法注册类时可以传入额外的参数来实现接口
    Ajax 面向对象类型系统MyNamespace.MyClass.registerClass( " MyNamespace.MyClass " null   //  表示没有父类,
    Ajax 面向对象类型系统
    MyNamespace.IMyInterface1,MyNamespace.IMyInterface2, ...);

            注意:在Asp.Net Ajax中与.Net中一样,只能单继承,但可以实现多接口

4、枚举类型

  • 枚举类型就是数字
  • 它的存在是为了增加代码的可读性
  • 可以定义为标记
  • 每个枚举类型都有toString和parse方法
    Ajax 面向对象类型系统MyNamespace.MyFlags  =   function ()
    Ajax 面向对象类型系统Ajax 面向对象类型系统
    ... {
    Ajax 面向对象类型系统    
    throw Error.notImplemented();
    Ajax 面向对象类型系统}

    Ajax 面向对象类型系统MyNamespace.MyFlags.prototype 
    =  
    Ajax 面向对象类型系统Ajax 面向对象类型系统
    ... {
    Ajax 面向对象类型系统    Item1 : 
    1,
    Ajax 面向对象类型系统    Item2 : 
    2,
    Ajax 面向对象类型系统    Item3 : 
    4,
    Ajax 面向对象类型系统    None : 
    0,
    Ajax 面向对象类型系统    All : 
    7
    Ajax 面向对象类型系统}

    Ajax 面向对象类型系统MyNamespace.MyFlags.registerEnum(
    " MyNamespace.MyFlags " true );

           注册枚举使用registerEnum方法,第二个参数是判断是否是标记类型类型,可缺省,如果是一个标记,那么内部成员的值按照2的次方赋予。枚举类型是没有构造函数的,所以构造函数抛出未实现异常。枚举类型的toString方法有两种,一种是prototype的toString方法,没有参数,它是直接将此枚举对象转化为数字,然后作为字符串输出。另一种是枚举类型中的静态方法,需要传递一个参数,参数类型为枚举类型,它转换这个枚举对象为枚举的描述。枚举类型的parse方法如下

MyNamespace.MyFlags.parse("Item1,Item2");

如果参数的字符串中只有Item1,那么表示把Item1字符串转换为一个标记或一个枚举类型,但如果有多个参数,那么是将两个值‘或’或者‘加起来’

4、反射方法

反射的prototype方法

NamespaceName.ClassName.getBaseType() 得到基类的类型
NamespaceName.ClassName.getInterfaces() 得到实现的接口集合
NamespaceName.ClassName.getName() 得到类型名
NamespaceName.ClassName.implementsInterface(NamespaceName.InterfaceName) 得到一个布尔值,判断是否实现了某个接口,实现了返回true,否则返回false
NamespaceName.ClassName.inheritsFrom(Namespace.ClassName) 得到一个布尔值,判断是否继承了某个类,继承了返回true,否则返回false
NamespaceName.Interface.isImplementedBy(Namespace.ClassName) 判断一个接口是否被另外一个类实现了,实现了返回true,否则返回false
Namespace.ClassName.isInstanceOfType(instance)

判断某个类型的实例是否是这个类型。是返回true,否则返回false

Type的静态方法

Type.getRootNamespaces() 得到根命名空间的集合
Type.isClass(Namespace.ClassName) 判断一个类型是否是类,是返回true,否则返回false
Type.isNamespace(Namespace) 判断一个类型是否是命名空间
Type.isEnum(TypeName) 判断一个类型是否是枚举类型
Type.isFlags(TypeName) 判断一个类型是否是标记
Type.parse(Namespace.ClassName) 通过反射的方法,按照类名,和命名空间创建一个命名空间下的某个类的实例
Object.getType(Instance) 通过实例得到这个实例的类型
Object.getTypeName(Instance)

通过实例得到这个实例的类型名

使用Asp.Net Ajax客户端编程可能需要用到js文件,那么在页面上需要引入这个js文件。但是不能使用src=地址这种方法引入文件,因为直接使用这种方法导入文件,要包含Asp.Net Ajax客户端组件的js文件。最好在ScriptManager里面加入一个Scirpts标签然后在Scripts里加入<asp:ScriptReference Path="js"/>,因为使用ScriptManager来引用会自动导入Asp.Net Ajax的客户端组件的js文件

Ajax 面向对象类型系统< asp:ScriptManager  ID ="ScriptManager1"  runat ="server" >
Ajax 面向对象类型系统Ajax 面向对象类型系统    
< Script > ...
Ajax 面向对象类型系统        
<asp:ScriptReference Path="Employee.js"/ >
Ajax 面向对象类型系统    
</ Script >
Ajax 面向对象类型系统
</ asp:ScriptManager >
并且,所有的类型调用,方法调用都必须在这个ScirptManager之后,否则会造成找不到类型错误