面向对象的JavaScript编程

2008-02-23 07:40:00来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

Javascript对于做过Web程序的人不应该是陌生,初期是用来做一些简单的验证,基本上是在玩弄一些技巧性的东西。IE 4.0引入了DHTML,同时为了对抗etscape的Javascript,提出了自己的脚本语言JScript,除了遵循EMAC的标准之外,同时增加了许多扩展,如下要提到的OOP编程就是其中的一个,为了命且概念,我以下提到的Javascript都是Microsoft Iteret Explorer 4.0以上实现的JScript,对于etscape,我没有做过太多的程序,所以一些的区别也就看出来。


  Javascript不是一个支持面向对象的语言,更加算不上一个开发平台,但是Javascript提供了一个非常强大的基于prototype的面向对象调用功能,你可以在你自己需要的地方使用他们。因此,如何使用对象?本文尽可能从Javascript面向对象实现原理出发,解析清楚它的工作模型。在了解这些模型之后,你可以在自己的脚本库中编写一些实现代码,然后在其他地方调用。

&bsp;

  Javascript的语法和C 很接近,不过在类实现中没有使用关键字Class,实现继承的时候也没有采用传统的Public或者Implemet等等所谓的关键字来标示类的实现。这样的情况下,可能有就有人会问,如何编写Javascript的Class,如何实现继承。我开始也是百思不得其解,后来看了MSD,才知道采用了prototype来实现,包括继承和重载,也可以通过这个关键字来实现。

&bsp;

  Javascript的函数很奇怪,每个都是默认实现了Optioal的,即参数都可以可选的,fuctio a(var1,var2,var3),在调用的过程中a(),a(value1),a(value1,value2)等等的调用都是正确的,至少在即使编译部分可以完整通过,至于其它,只是和函数的实现逻辑比较相关了。

  以下就JS对于类的实现、继承、重载详细介绍其实现方式。

  1。实现

  Js类的实现就通过函数直接实现的,每个函数可以直接看成class,如下代码

  fuctio ClassTest1(){

    ...//implemet code

  }

  var a=ew ClassTest1

  

  fuctio ClassTest2(var1){

    ...//implemet code

  }

  var b=ew ClassTest("value")

  对于类的属性,可以通过两种方式实现

  1)this."<Property or Method"的方式实现,在类声明函数中直接给出函数的实现,如 this.Add=ew fuctio(strUserame,strPassword)这样的方式调用,编写的方式在Class Fuctio中调用。

  2)通过ClassFuctio.prototype.[Fuctioame]=fuctio(var1,var2...){//todo}这样的方式完成调用。

  这两种方式从目标来看是一致的,按照我个人的观点来看,区别的只是在于实现方式,通过this.propertyame的方式来创建,Jscript自动创建了property或者method的入口,不过从程序的角度而言,还是使用prototype的关键字实现比较灵活。

  

  另外Javascript也可以和我们C 中那种嵌套声明的方法来声明,C 实现的方法如下

  Public Class Classame:ParetClass{

    Public DataType&bsp;Fuctioame(){

&bsp;

    }

    Public Class&bsp;Classame{

      Public DataType&bsp;Fuctioame(){

      }

    }

  }

  在Javascript当中,当然不存在class这样的关键字了,所以实现起来有点戏剧性,不过仍然为一个非常巧妙的实现。

  fuctio classame(){

    //Property Implemet

    this.Userame="blue";

    //Method Implemet

    this.Add=ew fuctio(){

&bsp;

    }

    //Sub Class Implemet

    fuctio SubClassame(){

      this.Propertyame="hi"      

    }

    //sub class method implemet

    SubClassame.prototype.Chage=fuctio{

&bsp;

    }

  }

  //Mai Class Method Implemet

  classame.prototype.Delete=fuctio(){

&bsp;

  }

  如上的代码大致演示了Javascript类中属性和方法的实现,另外有一点比较困惑,整个class中都是public的,没有关键字private之类的可以控制某些方法是否隐藏,那么在我们编写代码实现的规范中,我看国外一些程序员都是使用_fuctioame这样子为函数命的方法来区分,但是在调用过程中实际还可以调用的。

  实现了属性和方法,剩下的就是Evet的实现了,我查找了许多资料,包括整个MSD关于JScript的参考,都没有看到一个很好的模型关于事件实现的,后来参考了一些站点编写HTA(HTML Compoet,有空我会写一些相关的文章)的实现,借助于比较扭曲(我个人认为)的方法可以大致的实现基于事件驱动的功能。大致的思路是这样子的:

  1).将所有的事件定义成属性,只要简单的声明就可以

  2).在需要触发事件的代码中判断事件属性是否是一个函数,如果是函数,直接执行函数代码,如果是字符串,那么执行字符串函数,通过eval(str)来执行。

  3) .在类的实例当中注册事件函数。

  为了简单说明如上的思路,采用timer这样简单的例子来表述如上的所提到的内容,如果只是为了简单的实现timer的功能,Javascript中setIterval函数就可以满足全部的要求,如下的代码只是用来说明Timer的工作原理。

//Class For Timer
fuctio Timer(iIterval){
&bsp;//if ot set the timer iterval ,the defalut set to 500ms
&bsp;this.Iterval=iIterval || 500;
&bsp;this._hadleIterval;
&bsp;this.TimerEvet=ull
&bsp;fuctio Start(){
&bsp;&bsp;if(this.Iterval!=0){
&bsp;&bsp;&bsp;this._hadleIterval=setIterval("TimerCallBack()",this.Iterval);
&bsp;&bsp;}
&bsp;}
&bsp;fuctio Start(){
&bsp;&bsp;clearIterval(this._hadleIterval);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:一则装载页面进度条

下一篇:破解网页禁止鼠标右键的技巧