Eric Liu(The Road to Architect)

有些人注定要生活在彼岸 可以亲近可以爱怜 甚至可以穷尽一生去思念 只是无法触及 有些距离 注定不能跨越 只能俩俩相望 就像有些爱只能养在心里 长在眼中 不要捧在手里 放在身边 注定只能邂逅 无法遭遇

用户操作
[即时聊天] [发私信] [加为好友]
刘如鸿(Eric Liu)
刘如鸿(Eric Liu)的公告
    从最近开始,我会逐步写一些关键软件架构方面的话题,也是对于我过去几年以来技术的一个总结,不管对的还是错的,谨代表我个人在写作时期的观点.
最近评论
kuangheng10:学习了谢谢
a43350860:#hbqudeding 发表于2008-05-14 20:37:48 IP: 59.174.79.*
明摆着啊,.NET肯定比JAVA好啊

------------------------------------------------------
一般一个成熟的开发人员,不会丢出如此幼稚的话!
谁好,谁不好,不是我们说的算!
……
weiertzw:什么叫.net明摆着比java好呢?
zhujian888:最近用.net 做css + div做标准网站比较吃力。开发不见得快啊,还没有php快。.net大多控件生成table。还有些服务器控件在IE上生成是DIV在firefox上就是span,你说css怎么写。所以 这时候就不能用服务器控件。变成了用.net写asp感觉了。
yxred:请注意应用……
.net做的网站,明显比其它的要快些……
文章分类
收藏
    相册
    .NET four year
    Article Photos
    个人推荐
    嘿友,连接你我他
    坠落的淡蓝(个人BLOG)(RSS)
    榕树下
    技术站点
    Asp.Net
    WindowsForms
    博客堂
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 面向对象的JavaScript编程收藏

    新一篇: SOA:新衣裳还是美丽的谎言? | 旧一篇: 回归C/S?解释Bindows

        面向对象的JavaScript编程


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


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

     

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

     

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

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

        1。实现

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

        function ClassTest1(){

            ...//implement code

        }

        var a=new ClassTest1

       

        function ClassTest2(var1){

            ...//implement code

        }

        var b=new ClassTest("value")

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

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

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

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

       

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

        Public Class ClassName:ParentClass{

            Public DataType FunctionName(){

     

            }

            Public Class ClassName{

                Public DataType FunctionName(){

                }

            }

        }

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

        function className(){

            //Property Implement

            this.UserName="blue";

            //Method Implement

            this.Add=new function(){

     

            }

            //Sub Class Implement

            function SubClassName(){

                this.PropertyName="hi"           

            }

            //sub class method implement

            SubClassName.prototype.Change=function{

     

            }

        }

        //Main Class Method Implement

        className.prototype.Delete=function(){

     

        }

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

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

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

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

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

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

    //Class For Timer
    function Timer(iInterval){
     //if not set the timer interval ,then defalut set to 500ms
     this.Interval=iInterval || 500;
     this._handleInterval;
     this.TimerEvent=null
     function Start(){
      if(this.Interval!=0){
       this._handleInterval=setInterval("TimerCallBack()",this.Interval);
      }
     }
     function Start(){
      clearInterval(this._handleInterval);
     }
     function TimerCallBack(){
      if (typeof this.TimerEvent=="function"){
       this.TimerEvent();
      }
      else if(this.TimerEvent!=null && this.TimerEvent.length>0){
       eval(this.TimerEvent);
      }
     }

    //Code for Instance
    var t=new Timer(3);

    //------------------------------------//

    //1.
    t.TimerEvent=function(){
    //todo
    }

    //2.
    t.TimerEvent="alert(\"hello\")";

    //3.

    t.TimerEvent=tTimerCall;

    //----------------------------------//
    t.Start();
    t.Stop();

    function tTimerCall(){

     

    }

     

        实际工作代码是在TimerCallBack()上面实现,事件触发作为属性的方式来实现,在应用实例中,代码提供了三种方法去调用事件,不过在事件的回调当中,我还没有想到如何可以带参数,只有才各自的实现当中访问各自需要的属性才能够实现全部的要求。

     

        2。继承。

        刚采用了大篇幅的文字去介绍如何实现Javascript的各种实现,也就是从逻辑上完成了一个封装class的实现,从某种意义上来说,class的实现是真正脚本编程中使用最多的部分,不过如果只是要完成如上的功能,使用VBScript来编写更能更加清晰,毕竟VBscript提供了class关键字,同时提供了public private这两个关键字,可以清晰的将公共和私有对象分离,至于事件的实现,也可以采用类似Javascript实现的思路,只是对于函数的引用需要采用GetRef这个函数,具体的用法可以参考scripting reference,MSDN里头也有详细的介绍,而Javascript强大至于在于如下要说的了,虽然具体的东西可能不多。

        如上所言,我们已经完成了一个基本的类实现Timer,现在要做的是重新编写这个类,我们简单的只是想在这个类之中加入一个方法,提供当前的系统时间,方法的名称为getSystemDate,显然如果全部重新编写,那就失去了我这里说的意义了。先看看如下的实现。

        function NewTimer(iInterval){

            //call super

            this.base=Timer;

            this.baseiInterval);       

        }

        NewTimer.prototype=new Timer;

        NewTimer.prototype.getSystemDate=function(){

            var dt=new Date();

            return dt.getYear()+"-"+dt.getMonth()+"-"+dt.getDay()

        }

       

        上述代码实现了NewTimer类,从Timer继承,Javascript没有使用或者javapublic那样类似的关键字,只是通过newclassname.prototype=new baseclass这样的方法来完成,同时NewTimer实现了getSystemDate的方法,在NewTimer的初始化函数中,我使用了this.base=Timer,是为了引用父类的实现,不过在对于父类其他实现函数的调用,到现在我没有找到一个确定的方法,是否通过this.base.start()那样来调用还是其他的,如果有谁比较清楚的,麻烦告诉我,另外在netscape的站点上,我查到有一个特殊的"__proto__"的属性好像是对于父类的直接引用,不过具体的我也没有尝试过,在msdn中也没有看到对于__proto__的支持。

       

        3。重载

        或许这个是OOP编程中比较复杂的地方了,在Javascript的实现中有点无奈,也就是通过prototype的方式来完成的,不过因为我不清楚如何调用父类的实现函数,那么在重载中只能够重新编写所有的实现了,另外就是在实现中实例化一个父类,然后通过调用它来返回需要的东西。

        Javascript中所有的对象都是从Object继承下来的,object提供了toString()的方法,也就是说如果调用alert(objInstance)这样的过程,实际上是调用了alert(objInstance.toString())的方法,如果没有编写实现,object默认的toString()都是"object object"这样子的,在许多地方需要重载这个函数的,比如Timer,如果我们希望var ins=new Timer(5);alert(ins)调用得到的是interval的值5,那么就需要重新编写toString()方法了

        Timer.prototype.toString=function(){ return this.Interval};

        以上代码实现之后alert(ins)得到的就是5了。

     

     

    发表于 @ 2004年05月19日 13:18:00|评论(loading...)|编辑

    新一篇: SOA:新衣裳还是美丽的谎言? | 旧一篇: 回归C/S?解释Bindows

    评论

    #雪候鸟 发表于2005-02-17 00:13:00  IP:
    TrackBack来自《在JavaScript面向对象编程中使用继承(1) 》

    Ping Back来自:blog.csdn.net
    #windseeds 发表于2004-08-04 09:48:00  IP: 218.244.245.*
    是ECMA,不是EMAC吧
    #ebw 发表于2004-11-04 17:13:00  IP: 218.87.20.*
    引用:不过在对于父类其他实现函数的调用,到现在我没有找到一个确定的方法,是否通过this.base.start()那样来调用还是其他的

    直接this.start()行吗?我试了下行的
    #ebw 发表于2004-11-04 17:18:00  IP: 218.87.20.*
    调用父类的实现函数
    <script language=javascript>
    function a(){
    this.aa=function(){
    alert("a.aa");
    }
    }
    function b(){
    this.base=a;
    this.base();
    this.aa();//调用父类的实现函数
    }
    var bb=new b();
    </script>
    #Codemon 发表于2004-12-15 17:24:00  IP: 211.8.239.*
    看看我的实现方法
    #Codemon 发表于2004-12-15 17:25:00  IP: 211.8.239.*
    http://blog.csdn.net/codemon/archive/2004/12/04/codemon_20041204_JS.aspx
    #birdshome 发表于2005-02-03 15:26:00  IP: 211.144.175.*
    ebw的方法只能是没有override的时候可以,override了aa,就调不到基类的方法了。
    #mitch 发表于2005-02-06 16:25:00  IP: 211.144.96.*
    好文章,有深度,有创意
    #bill 发表于2005-06-23 11:17:00  IP: 61.186.252.*
    发现了一个大量的公益免费下载资料的地区!和大家共享!
    http://www.51dibs.com
    #dolby 发表于2005-10-13 09:35:00  IP: 211.100.21.*
    birdshome 发表于2005-02-03 3:26 PM
    ebw的方法只能是没有override的时候可以,override了aa,就调不到基类的方法了。

    可以新建一个对象。

    <script language=javascript>
    function a(){
    this.aa=function(){
    alert("a.aa");
    }
    }
    function b(){
    this.base=a;
    this.base();
    this.aa=function()
    {
    var objA=new A();
    objA.aa();
    }
    ;//调用父类的实现函数
    }
    var bb=new b();
    </script>
    #dulao5 发表于2005-10-17 15:28:00  IP: 211.100.21.*
    调用父类:
    Base.prototype.fun.call(this,arg1,arg2)
    #kvspas 发表于2007-04-02 21:39:42  IP: 221.237.77.*
    不错,学习了继承,可惜还没有实现多态.
    #kuangheng10 发表于2008-07-24 11:48:14  IP: 116.228.4.*
    学习了谢谢
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 刘如鸿(Eric Liu)