[ASP.NET AJAX]Function对象及Type类的方法介绍

简介:

上一回我们从总体上认识了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扩展的几个对象:

 1   Function.__typeName = " Function " ;
 2   Function.createCallback = function (b,a) {
 3    return function(){
 4     var e=arguments.length;
 5     if(e>0){
 6       var d=[];
 7       for(var c=0;c<e;c++)
 8         d[c]=arguments[c];
 9       d[e]=a;
10       return b.apply(this,d)
11     }

12     return b.call(this,a)
13   }

14  }
;
15   Function.createDelegate = function (a,b) {
16    return function(){
17      return b.apply(a,arguments)
18    }

19  }
;
20   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个方法,下面我们将逐个进行介绍:

  1.[prototype]Type.callBaseMethod(instance,name,baseArguments)
  说明:
     这个函数主要调用基函数中的方法,相当于C#中的base;这个函数只有在继承函数时才会用到。
  参数:
     instance:将要被调用的基函数的当前实例,通常用this;
     name:将要被调用的基函数的名称,用字符串表示;
     baseArguments:将要被调用的基函数的参数。
  
  2.[prototype]Type.getBaseMethod(instance,name)
  说明:
     引用基函数的方法实例,如果你要通过Function.call函数来调用一个方法,这将是你的选择;不过我觉得和上一个函数的差别不是特别大,糊涂了。
  参数:
     instance:在这个函数中好像没有被调用,上一个函数的实现是通过这个函数来获取函数的,可能这个参数是为1中的instance参数预留的,我也搞不懂他们为什么这样干,高手自由高手的道理吧!
     name:当然是所要引用的方法的名称。

  3.[prototype]Type.getBaseType()
  说明:
      其实就是返回"typeof this.__baseType"的值,如果是"undefined"则返回null。

  4.[prototype]Type.getInterfaces()
  说明:
      通过这个可以获取当前实例所实现的接口对象数组,为一个Array对象。

  5.[prototype]Type.getName()
  说明:
      返回当前对象的名称,包括命名空间和类名称,如果为"undefined"返回""。

  6.[prototype]Type.implementsInterface(interfaceType)
  说明:
      如果当前类已经实现了interfaceType接口中的所有定义,则返回true,否则返回false。这也就可以实现在.NET中继承借口必须实现所有方法或属性的诺言:)

  7.[prototype]Type.inheritsFrom(parentType)
  说明:
      调用此方法可以判断当前实例是否继承自parentType类,如:var isInherited=ClassA.inheritsFrom(ClassB);如果当前实例继承自parentType则返回true,否则返回false。

  8.[prototype]Type.initializeBase(instance, baseArguments)
  说明:
      这是一个相当重要的函数,通过这个函数来初始化基函数的构造函数,也可以将自己注册为一个基函数。其中instance是初始化基类的对象,通常用this;baseArguments为基函数构造函数的参数,可以为空。

  9.[prototype]Type.isImplementedBy(typeInstance)
  说明:
      这个和6中正好相反,用来判断typeInstance是否实现了接口中的所有定义,如果是实现返回true,否则返回false。

  10.[prototype]Type.isInstanceOfType(instance)
  说明:
      判断类是否为instance的当前实例,主要用于要判断类是否为继承自他的类(子类)的实例。返回true/false。

  11.[prototype]Type.registerClass(typeName, baseType, interfaceTypes)
  说明:
      这个一看就知道是注册一个类的,baseType和interfaceTypes都是可选的,同时和.NET的一样,baseType最多一个,而接口就无所谓了。这个方法用在定一个类以后初始化之前,如果有baseType须在第一行通过Type.initializeBase来实例化基函数的构造函数。

  12.[prototype]Type.registerInterface(typeName)
  说明:
      将一个类注册为接口,接口中部包含任何的处理函数。

  13.[prototype]Type.resolveInheritance()
  说明:
      这个方法很好玩,拷贝基类的属性,来对当前类进行prototype扩展,可也就是扩展面向对象编程中的反射。

  14.Type.getRootNamespaces()
  说明:
      静态函数(我不知道别人怎么叫,我就叫他静态函数就好了:),通过这个方法可以获取所有命名空间的Array数组(即返回一个数组,包含所有命名空间)。

  15.Type.isClass(type)
  16.Type.isInterface(type)
  17.Type.isNamespace(type)

  18.Type.parse(typeName,ns)
  说明:
      厉害了,通过这个可以创建一个对象,即.NET中的利用Type.GetType("type,ns");和Invoke();来反射实例化一个类。ns命名空间可选项。如果类没有位于一个命名空间中(如:Type类),typeName可以为null。

  19.Type.registerNamespace(namespacePath)
  说明:
      注册一个命名空间。

  20.[prototype]Type.registerEnum(name,flag)
  说明:
      注册为枚举类型,flag判断是否为bit类型,可选。

  
  21.Type.isEnum(type)
  22.Type.isFlags(type)

  写着写着胡了,例子还是没有加上,而且原来的理解好像很模糊,为了让人能更直观的理解,我把有些例子放在这里(html文件):
 

  如果要测试Enum要用<ScriptManager/>空间引用脚本,提供例子里的脚本没有Number类的扩展,所以不能测试Enum,哎,几个小时就这样过去了,不过也掌握了不少,在我写这篇文章是越来越觉得很模糊,如果有什么错误的地方请大家指出,允许Bill Gate先富起来,然后带动我们富裕,最后实现大家共同富裕吗:)

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2006/12/24/nexplus_ajax_type.html,如需转载请自行联系原作者

相关文章
|
1月前
|
人工智能 Python
083_类_对象_成员方法_method_函数_function_isinstance
本内容主要讲解Python中的数据类型与面向对象基础。回顾了变量类型(如字符串`str`和整型`int`)及其相互转换,探讨了加法在不同类型中的表现。通过超市商品分类比喻,引出“类型”概念,并深入解析类(class)与对象(object)的关系,例如具体橘子是橘子类的实例。还介绍了`isinstance`函数判断类型、`type`与`help`探索类型属性,以及`str`和`int`的不同方法。最终总结类是抽象类型,对象是其实例,不同类型的对象有独特运算和方法,为后续学习埋下伏笔。
69 7
083_类_对象_成员方法_method_函数_function_isinstance
|
1月前
|
Python
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
67 17
|
1月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
62 11
|
开发框架 前端开发 JavaScript
ASP.NET AJAX使用方法概述(三)
ASP.NET AJAX使用方法概述(三)
105 1
|
10月前
|
机器学习/深度学习
现代深度学习框架构建问题之Sigmoid类实现Function接口如何解决
现代深度学习框架构建问题之Sigmoid类实现Function接口如何解决
59 4
|
9月前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
120 0
|
9月前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
348 0
|
9月前
|
开发框架 .NET API
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute
101 0
|
9月前
|
开发框架 前端开发 .NET
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
121 0
|
10月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。

热门文章

最新文章