[ASP.NET AJAX]Function对象及Type类的方法介绍
程序员文章站
2022-07-02 16:50:01
上一回我们从总体上认识了javascript microsoft ajax library由于临时有事,没有加入事例显得有点抽象,这一回一定会...
上一回我们从总体上认识了javascript microsoft ajax library由于临时有事,没有加入事例显得有点抽象,这一回一定会通过一些事例更加直观的来会一会asp.net ajax脚本库中一个很是重要的类type。这个类提供了一些扩展面向对象编程的一些反射方法,通过这个类我们可以注册类似.net中的一些(如:命名空间,类,枚举等等)基本类型。这个type类继承自window是一个global类型,不属于任何命名空间。下面我们来看看type中的一些基本方法以及是怎样实一些方法的实现方式...
在认识type类之前,我们首先要来看一看一个很重要的对象,那就是function对象。function对象是javascript的内部对象,例如:日期对象(date),数组对象(array),字符对象(string)以及(object,regexp,math,error等)都属于这种,可以通过new来实例化一个对象。除了我们常见的javascript申明的函数,我们也可以用以下的方法构建我们的函数对象:var myfunction=new function(arguments,statement)。由于我对脚本不是很熟悉,对prototype(不过听说是通过给出一个原型对象来指明所要创建的对象的类型,然后用这个原型对象的方法创建出更多同类型的对象,原始模型模式属于对象的创建模式)也不是很了解,不过经过我简单的测试了一下,如果对function进行prototype扩展可以通过new来申明对象后再引用他,也可以直接调用function.(方法或函数)。如果直接运用function.uname来扩展这个uname就只能通过function.uname调用,这让我想起了.net中的静态方法(c#:static;vb:share),有了这些我们来看看asp.net ajax中对function扩展的几个对象:
function.__typename="function";
function.createcallback=function(b,a){
return function(){
var e=arguments.length;
if(e>0){
var d=[];
for(var c=0;c<e;c++)
d[c]=arguments[c];
d[e]=a;
return b.apply(this,d)
}
return b.call(this,a)
}
};
function.createdelegate=function(a,b){
return function(){
return b.apply(a,arguments)
}
};
function.emptyfunction=function.emptymethod=function(){};
从上面我们可以看出function扩展了一个属性(__typename)和几个方法(我们可以把它看成.net中的静态对象来调用,如果用new function();再来调用就会得到"undefined";可能这是javascript最基本的东西,但是我以前没有用过这种对象来写过脚本,也没有系统的学过javascript,所以不要笑话我哦:)正在学习中...),在上面我还发现了一个比较少见的call/apply;网上搜了一下发现在<<全面理解javascript的caller,callee,call,apply概念>>有比较详细的介绍。如果我没猜错的话:function.createcallback("callback method","callback argument")和回调有关;function.createdelegate("object通常用this","执行的方法"),即通过function.createdelegate创建的代理方法继承了b方法,从而来完成整个代理的过程(不知道是否正确!);function.emptyfunction/function.emptymethod应该是为了接口和虚函数而准备的。
type对象继承了function对象,由function对象进一步延伸,在这里我们就不讨论type地实现过程,我们今天主要来看看type中的一些重要的方法。type中总共有22个方法,下面我们将逐个进行介绍:
.[prototype]type.callbasemethod(instance,name,basearguments)
说明:
这个函数主要调用基函数中的方法,相当于c#中的base;这个函数只有在继承函数时才会用到。
参数:
instance:将要被调用的基函数的当前实例,通常用this;
name:将要被调用的基函数的名称,用字符串表示;
basearguments:将要被调用的基函数的参数。
.[prototype]type.getbasemethod(instance,name)
说明:
引用基函数的方法实例,如果你要通过function.call函数来调用一个方法,这将是你的选择;不过我觉得和上一个函数的差别不是特别大,糊涂了。
参数:
instance:在这个函数中好像没有被调用,上一个函数的实现是通过这个函数来获取函数的,可能这个参数是为1中的instance参数预留的,我也搞不懂他们为什么这样干,高手*高手的道理吧!
name:当然是所要引用的方法的名称。
.[prototype]type.getbasetype()
说明:
其实就是返回"typeof this.__basetype"的值,如果是"undefined"则返回null。
.[prototype]type.getinterfaces()
说明:
通过这个可以获取当前实例所实现的接口对象数组,为一个array对象。
.[prototype]type.getname()
说明:
返回当前对象的名称,包括命名空间和类名称,如果为"undefined"返回""。
.[prototype]type.implementsinterface(interfacetype)
说明:
如果当前类已经实现了interfacetype接口中的所有定义,则返回true,否则返回false。这也就可以实现在.net中继承借口必须实现所有方法或属性的诺言:)
.[prototype]type.inheritsfrom(parenttype)
说明:
调用此方法可以判断当前实例是否继承自parenttype类,如:var isinherited=classa.inheritsfrom(classb);如果当前实例继承自parenttype则返回true,否则返回false。
.[prototype]type.initializebase(instance, basearguments)
说明:
这是一个相当重要的函数,通过这个函数来初始化基函数的构造函数,也可以将自己注册为一个基函数。其中instance是初始化基类的对象,通常用this;basearguments为基函数构造函数的参数,可以为空。
.[prototype]type.isimplementedby(typeinstance)
说明:
这个和6中正好相反,用来判断typeinstance是否实现了接口中的所有定义,如果是实现返回true,否则返回false。
.[prototype]type.isinstanceoftype(instance)
说明:
判断类是否为instance的当前实例,主要用于要判断类是否为继承自他的类(子类)的实例。返回true/false。
.[prototype]type.registerclass(typename, basetype, interfacetypes)
说明:
这个一看就知道是注册一个类的,basetype和interfacetypes都是可选的,同时和.net的一样,basetype最多一个,而接口就无所谓了。这个方法用在定一个类以后初始化之前,如果有basetype须在第一行通过type.initializebase来实例化基函数的构造函数。
.[prototype]type.registerinterface(typename)
说明:
将一个类注册为接口,接口中部包含任何的处理函数。
.[prototype]type.resolveinheritance()
说明:
这个方法很好玩,拷贝基类的属性,来对当前类进行prototype扩展,可也就是扩展面向对象编程中的反射。
.type.getrootnamespaces()
说明:
静态函数(我不知道别人怎么叫,我就叫他静态函数就好了:),通过这个方法可以获取所有命名空间的array数组(即返回一个数组,包含所有命名空间)。
.type.isclass(type)
.type.isinterface(type)
.type.isnamespace(type)
.type.parse(typename,ns)
说明:
厉害了,通过这个可以创建一个对象,即.net中的利用type.gettype("type,ns");和invoke();来反射实例化一个类。ns命名空间可选项。如果类没有位于一个命名空间中(如:type类),typename可以为null。
.type.registernamespace(namespacepath)
说明:
注册一个命名空间。
.[prototype]type.registerenum(name,flag)
说明:
注册为枚举类型,flag判断是否为bit类型,可选。
.type.isenum(type)
.type.isflags(type)
写着写着胡了,例子还是没有加上,而且原来的理解好像很模糊,为了让人能更直观的理解,我把有些例子放在这里(html文件):
如果要测试enum要用<scriptmanager/>空间引用脚本,提供例子里的脚本没有number类的扩展,所以不能测试enum,哎,几个小时就这样过去了,不过也掌握了不少,在我写这篇文章是越来越觉得很模糊,如果有什么错误的地方请大家指出,允许bill gate先富起来,然后带动我们富裕,最后实现大家共同富裕吗:)
在认识type类之前,我们首先要来看一看一个很重要的对象,那就是function对象。function对象是javascript的内部对象,例如:日期对象(date),数组对象(array),字符对象(string)以及(object,regexp,math,error等)都属于这种,可以通过new来实例化一个对象。除了我们常见的javascript申明的函数,我们也可以用以下的方法构建我们的函数对象:var myfunction=new function(arguments,statement)。由于我对脚本不是很熟悉,对prototype(不过听说是通过给出一个原型对象来指明所要创建的对象的类型,然后用这个原型对象的方法创建出更多同类型的对象,原始模型模式属于对象的创建模式)也不是很了解,不过经过我简单的测试了一下,如果对function进行prototype扩展可以通过new来申明对象后再引用他,也可以直接调用function.(方法或函数)。如果直接运用function.uname来扩展这个uname就只能通过function.uname调用,这让我想起了.net中的静态方法(c#:static;vb:share),有了这些我们来看看asp.net ajax中对function扩展的几个对象:
复制代码 代码如下:
function.__typename="function";
function.createcallback=function(b,a){
return function(){
var e=arguments.length;
if(e>0){
var d=[];
for(var c=0;c<e;c++)
d[c]=arguments[c];
d[e]=a;
return b.apply(this,d)
}
return b.call(this,a)
}
};
function.createdelegate=function(a,b){
return function(){
return b.apply(a,arguments)
}
};
function.emptyfunction=function.emptymethod=function(){};
从上面我们可以看出function扩展了一个属性(__typename)和几个方法(我们可以把它看成.net中的静态对象来调用,如果用new function();再来调用就会得到"undefined";可能这是javascript最基本的东西,但是我以前没有用过这种对象来写过脚本,也没有系统的学过javascript,所以不要笑话我哦:)正在学习中...),在上面我还发现了一个比较少见的call/apply;网上搜了一下发现在<<全面理解javascript的caller,callee,call,apply概念>>有比较详细的介绍。如果我没猜错的话:function.createcallback("callback method","callback argument")和回调有关;function.createdelegate("object通常用this","执行的方法"),即通过function.createdelegate创建的代理方法继承了b方法,从而来完成整个代理的过程(不知道是否正确!);function.emptyfunction/function.emptymethod应该是为了接口和虚函数而准备的。
type对象继承了function对象,由function对象进一步延伸,在这里我们就不讨论type地实现过程,我们今天主要来看看type中的一些重要的方法。type中总共有22个方法,下面我们将逐个进行介绍:
.[prototype]type.callbasemethod(instance,name,basearguments)
说明:
这个函数主要调用基函数中的方法,相当于c#中的base;这个函数只有在继承函数时才会用到。
参数:
instance:将要被调用的基函数的当前实例,通常用this;
name:将要被调用的基函数的名称,用字符串表示;
basearguments:将要被调用的基函数的参数。
.[prototype]type.getbasemethod(instance,name)
说明:
引用基函数的方法实例,如果你要通过function.call函数来调用一个方法,这将是你的选择;不过我觉得和上一个函数的差别不是特别大,糊涂了。
参数:
instance:在这个函数中好像没有被调用,上一个函数的实现是通过这个函数来获取函数的,可能这个参数是为1中的instance参数预留的,我也搞不懂他们为什么这样干,高手*高手的道理吧!
name:当然是所要引用的方法的名称。
.[prototype]type.getbasetype()
说明:
其实就是返回"typeof this.__basetype"的值,如果是"undefined"则返回null。
.[prototype]type.getinterfaces()
说明:
通过这个可以获取当前实例所实现的接口对象数组,为一个array对象。
.[prototype]type.getname()
说明:
返回当前对象的名称,包括命名空间和类名称,如果为"undefined"返回""。
.[prototype]type.implementsinterface(interfacetype)
说明:
如果当前类已经实现了interfacetype接口中的所有定义,则返回true,否则返回false。这也就可以实现在.net中继承借口必须实现所有方法或属性的诺言:)
.[prototype]type.inheritsfrom(parenttype)
说明:
调用此方法可以判断当前实例是否继承自parenttype类,如:var isinherited=classa.inheritsfrom(classb);如果当前实例继承自parenttype则返回true,否则返回false。
.[prototype]type.initializebase(instance, basearguments)
说明:
这是一个相当重要的函数,通过这个函数来初始化基函数的构造函数,也可以将自己注册为一个基函数。其中instance是初始化基类的对象,通常用this;basearguments为基函数构造函数的参数,可以为空。
.[prototype]type.isimplementedby(typeinstance)
说明:
这个和6中正好相反,用来判断typeinstance是否实现了接口中的所有定义,如果是实现返回true,否则返回false。
.[prototype]type.isinstanceoftype(instance)
说明:
判断类是否为instance的当前实例,主要用于要判断类是否为继承自他的类(子类)的实例。返回true/false。
.[prototype]type.registerclass(typename, basetype, interfacetypes)
说明:
这个一看就知道是注册一个类的,basetype和interfacetypes都是可选的,同时和.net的一样,basetype最多一个,而接口就无所谓了。这个方法用在定一个类以后初始化之前,如果有basetype须在第一行通过type.initializebase来实例化基函数的构造函数。
.[prototype]type.registerinterface(typename)
说明:
将一个类注册为接口,接口中部包含任何的处理函数。
.[prototype]type.resolveinheritance()
说明:
这个方法很好玩,拷贝基类的属性,来对当前类进行prototype扩展,可也就是扩展面向对象编程中的反射。
.type.getrootnamespaces()
说明:
静态函数(我不知道别人怎么叫,我就叫他静态函数就好了:),通过这个方法可以获取所有命名空间的array数组(即返回一个数组,包含所有命名空间)。
.type.isclass(type)
.type.isinterface(type)
.type.isnamespace(type)
.type.parse(typename,ns)
说明:
厉害了,通过这个可以创建一个对象,即.net中的利用type.gettype("type,ns");和invoke();来反射实例化一个类。ns命名空间可选项。如果类没有位于一个命名空间中(如:type类),typename可以为null。
.type.registernamespace(namespacepath)
说明:
注册一个命名空间。
.[prototype]type.registerenum(name,flag)
说明:
注册为枚举类型,flag判断是否为bit类型,可选。
.type.isenum(type)
.type.isflags(type)
写着写着胡了,例子还是没有加上,而且原来的理解好像很模糊,为了让人能更直观的理解,我把有些例子放在这里(html文件):
如果要测试enum要用<scriptmanager/>空间引用脚本,提供例子里的脚本没有number类的扩展,所以不能测试enum,哎,几个小时就这样过去了,不过也掌握了不少,在我写这篇文章是越来越觉得很模糊,如果有什么错误的地方请大家指出,允许bill gate先富起来,然后带动我们富裕,最后实现大家共同富裕吗:)