欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[ASP.NET Ajax] ECMAScript基础类以及Asp.net Ajax对类<Object>的扩展

程序员文章站 2022-07-02 16:52:26
“everything is object”,在面向对象的编程语言中谁都知道这句话,但对我来说这是一种感觉,只可意会很难言传。由于我对javascrip...

“everything is object”,在面向对象的编程语言中谁都知道这句话,但对我来说这是一种感觉,只可意会很难言传。由于我对javascript和薄弱,所以在看asp.net ajax类库的同时也翻出了ecmascript顺便学习学习。在.net中所有类都是继承自object,同样在js中也一样说有都继承object,因此如果对object进行了扩展,那所有继承object类的后代肯定会拥有祖先的血缘。

既然开始学习javascript那就顺便在这里提一提他的原始数据类型,在js中有5个原始数据类型(undefined、null、boolean、number、string),可以通过typeof来判断变量和值的数据类型

1.        undefined: 当变量被声明但没有被初始化,或函数没有明确返回一个值的时候,该变量或函数即为 undefined 类型,是null类型的一种特性。

2.        null: 当一个对象的值不存在时,该对象返回null。

3.        boolean:一看就知道,一男一女true/false,值得注意的是0不等于false,但是可以转化为false。

4.        number:可以定义32位整型数据或64位浮点型数据。从网上的一些资料知道,浮点数在未被计算之前是以string类型存储(不知道是真是假)。当浮点类型数据很大或很小时(可以前后移动六位),将使用e表示法来表示浮点数据,最大可以存储17位数据。另外,isfinite()方法可以判断一个数值是否有限,isnan()方法可以判断一个数据是非数字类型。通过parseint()和parsefloat()可以将其他类型转化为数字类型,如果转化不成功则返回nan(not a number)。

5.        string:这是一个唯一没有大小限制的原始类型,其他类型可以通过tostring()转化为string类型,值得一提的是数字转化为string类型可以加入2.8.16作为参数已输出二进制,八进制和十六进制的字符串。

下面我们来看一下object类型,通过var obj=new object();可以申明一个对象。同.net中的object一样,它是所有类的基类。

它具有两个属性:constructor(相当于.net中的构造函数)建议一个对象函数引用,对于object类而言,该引用指向本地object()方法。prototype对象里prototype对象的一个引用值,通过这个属性可以反射每个对象中的prototype扩展的属性和方法,在asp.net ajax中也是利用这个属性类扩展和反射类的。

hasownproperty(property)—判断property属性是否存在于对象中,property数据类型为string;isprototypeof(object)— 判断一个对象是否是另一对象的 prototype;propertyisenumerable(property)— 判断所给出的属性能否使用 for 语句列举出来;tostring()—返回对象的原始类型string;valueof()—返回对象合适的原始值,对于多数类而言,返回的值和tostring()相同。这些就是原始object对象的方法,在其他类中这些方法以同样被继承。

在asp.net ajax中微软为了将整个类库扩展的更适合.net的开发人员,在原始的object对象中扩展了两个方法:

object.__typename="object";

object.gettype=function(b){

  var a=b.constructor;

  if(!a||typeof a!=="function"||!a.__typename||a.__typename==="object")return object;

  return a

};

object.gettypename=function(a){

  return object.gettype(a).getname()

};

从上面我们可以看到,object.gettype(type)这个静态方法可以获取一个类的对象,而object.gettypename(type)通过调用[prototype]type.getname()而获取类的名(包括命名空间)。这没有什么好说的,下面来看一下测试:

        <asp:scriptmanager id="scriptmanager1" runat="server" />

        <div>

        <script language="javascript">

        type.registernamespace("nexplus");

        //define a class;

        nexplus.objecttest=function(name){

          this._name=name;

        }

        nexplus.objecttest.prototype.getname=function(){

          return (this._name === undefined) ? null : this._name;

        }

        nexplus.objecttest.prototype.setname=function(name){

          this._name=name;

        }

        //register class;

        nexplus.objecttest.registerclass("nexplus.objecttest");

        

        nexplus.testobject=function(){

          var a=new nexplus.objecttest("test is success?");

          document.write(a.getname());

          document.write("<br/>");

          a.setname("success!");

          document.write(a.getname());

          document.write("<br/>");

          document.write(object.gettypename(a)+"<br/>")

        }

        //run;

        nexplus.testobject();

        </script>

        </div>

运行结果:

test is success?
success!
nexplus.objecttest

   这个比较简单,微软只是为了和.net框架更接近而扩展的object类,我觉得这两个在开发过程中应该很少用到吧,上面的测试顺便测试一下属性j。我很想知道有没有那个好心人翻译了ecmascript的规范文档,看英文真的好类;<.顺便附上一只捆牢我的两个操作符: ||:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(不一定是boolean值); &&:从第一个开始,遇到无意义(0,null,undefined,"",false,nan)的返回,否则返回最后一个表达式(不一定是boolean值)。