网络编程
位置:首页>> 网络编程>> JavaScript>> 由浅到深了解JavaScript类(3)

由浅到深了解JavaScript类(3)

作者:泣红亭 来源:无忧脚本 发布时间:2008-06-16 13:20:00 

标签:类,javascript,编程

静态方法
       
        与静态属性相似,它也有个另称:公共方法,同样属于类本身的。
       
        静态方法的定义方式是:
       
        类名.方法名 = function(参数1,参数2...参数n) 

 {
                //方法代码
        }

我们现在就来定义一个无忧用户类的注册新用户静态方法:

  WuYouUser.prototype.AddOne = function()
        {
                //***  同样具体代码不写出来,给静态属性Count增加1,表示注册用户数量又多一个
                WuYouUser.prototype.Count++;
        }

现在我们来看看如何用它,同样有两种方法:
       
        1.直接使用WuYouUser.prototype.AddOne()
        2.使用某实例的AddOne()
       
        这两种方法没有什么不同

  var Wo = new WuYouUser();
        var Biyuan = new WuYouUser();
        document.write(WuYouUser.prototype.Count); // 0
        
        Wo.AddOne();
        document.write(WuYouUser.prototype.Count); // 1
        document.write(Wo.Count); // 1
        document.write(Biyuan.Count); // 1
        
        WuYouUser.prototype.AddOne();
        document.write(WuYouUser.prototype.Count); // 2
        document.write(Wo.Count); // 2
        document.write(Biyuan.Count); // 2

可以看出不管是使用Wo.AddOne()还是WuYouUser.prototype.AddOne()效果都是一样的,都是给WuYouUser.prototype.Count加上1
       
        现在再看一段代码

   function NewClass() //由于上边的WuYouUser类不合适当这个例子的代码,我声明了一个新类NewClass
        {
                this.Name = "泣红亭"; //这里默认值为我的名字
        }
        
        NewClass.prototype.ChangeName = function(NewName)
        {
                this.Name = NewName;
        }
        
        var Wo = new NewClass();
        Wo.ChangeName("郑运涛"); //我的真名

可以看到Wo.Name确实已经变成了"郑运涛",这个方法似乎是可以用的,但里边是不是内有天机呢?
        再看下边的代码,类的定义以及ChangeName的定义我们照样,但改变一下下边的代码:

NewClass.prototype.ChangeName("郑运涛");
        document.write(NewClass.Name); //undefined,即未定义
        document.write(NewClass.prototype.Name); //郑运涛
        var Wo = new NewClass();
        document.write(Wo.Name); //泣红亭

可以看到我们并没有定义NewClass.prototype.Name这个静态属性,但编译器给我们自己加了一个。

可是再看下边输出Wo.Name,它并不是为"郑运涛",而是原来的默认值"泣红亭",说明了什么?

其实很简单,看一下NewClass的定义里已经有Name这个属性,因此Wo也有自己的Name属性,它跟NewClass.prototype.Name并不是同一个的,因此就还是那样子。

那为什么前一个例子运行了Wo.ChangeName("郑运涛")却能够实现改变Wo.Name属性呢?其实在这里跟改变Wo.Count的值是同一个道理,编译器自动给Wo增加了一个方法ChangeName,这个方法代码与NewClass.prototype.ChangeName一样,但Wo.ChangeName是Wo这个实例所特有的,而非NewClass.prototype.ChangeName!
       
        分析可知道在静态方法里尽量不要使用this这样的关键字来引用实例本身的属性,除非你有特别的目的,而且能够清楚地明白这里边的运行机制!
       
        如果真的需要在静态方法里使用this,可以直接把this当作参数传进去:

      NewClass.ChangeName = function(This,NewName) //注意这里是This,不是this
        {
                This.Name = NewName;
        }

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com