面向对象的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了。

转载于:https://www.cnblogs.com/pricks/archive/2010/02/10/1667092.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验3 SQL Server 表中记录更新操作

实验3 SQL Server 表中记录更新操作一、实验目的 1.掌握INSERT INTO语句的方法。 2.了解INSERT FROM语句的方法。 3.掌握UPDATE语句的方法。 4.掌握DELETE语句的方法。 二、实验要求 1.在已经创建好的eshop数据库中的各表中添加样例数据。 三、实验步骤 1.在eshop数据库的memb…

HTML 5 标签

HTML 5 <nav> 标签 定义和用法 <nav> 标签定义导航链接的部分。 实例 <nav> <a href"index.asp">Home</a> <a href"html5_meter.asp">Previous</a> <a href"html5_noscript.asp">Next</a>…

Assert和异常处理

Assert用于检查不应该发生情况&#xff0c;用来帮助开发人员对问题的快速定位。异常处理用于对程序发生异常情况的处理&#xff0c;增强程序的健壮性、容错性&#xff0c;减少程序使用中对用户不有好的行为&#xff0c;不让(通常也不必)用户知道发生了什么错误。实际开发中&…

tooctalstring_Java Long类toOctalString()方法的示例

tooctalstring长类toOctalString()方法 (Long class toOctalString() method) toOctalString() method is available in java.lang package. toOctalString()方法在java.lang包中可用。 toOctalString() method is used to represent an octal string of the given parameter […

汇编语言-009(表驱动选择 、条件控制流伪指令 、逻辑移位SHL,SHR 算术移位SAL,SAR)

1&#xff1a; 表驱动选择&#xff0c;用查表来代替多路选择结构的一种方法 .386 .model flat,stdcallinclude Irvine32.inc.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data CaseTable BYTE A ;查询值DWORD Process_A ;过程地址 EntrySize ($ - CaseT…

如何解决EDM邮件营销中的图片难题

随着互联网的高速发展&#xff0c;已然进入到了读图时代&#xff0c;EDM邮件营销尤为注重图片的运用。纯文本的邮件太枯燥&#xff0c;巧借图片&#xff0c;可以提高内容的可读性&#xff0c;吸引用户注意力。然而&#xff0c;我们却常常不得不面对这样的尴尬&#xff1a;打开邮…

实验2 SQL Server 表操作

实验2 SQL Server 表操作一、实验目的 1.了解表设计和表结构相关知识。 2.掌握管理工具创建、修改、查看和删除表的方法。 3.掌握T-SQL语句创建、修改、查看和删除表的方法。 4.了解表和数据库的关系。 二、实验要求 1.创建好的“网上购物系统”数据库eshop中的members表、pro…

深入理解.net的事件与委托机制

首先介绍一个为什么要在事件中引入委托这个概念&#xff1a;  事件是对象发送的消息&#xff0c;以发信号通知操作的发生。操作可能是由用户交互&#xff08;例如鼠标单击&#xff09;引起的&#xff0c;也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。…

Java ObjectOutputStream flush()方法与示例

ObjectOutputStream类flush()方法 (ObjectOutputStream Class flush() method) flush() method is available in java.io package. flush()方法在java.io包中可用。 flush() method is used to flush this stream and write bytes immediately of any buffered output to the u…

ffmpeg 命令裁剪合并

1 mp4格式&#xff1a; 裁剪从一个视频中的1分钟、2分钟、3分钟开始截取10秒 ffmpeg -i test_1280x720.mp4 -ss 00:01:00 -t 10 -codec copy copy1.mp4 ffmpeg -i test_1280x720.mp4 -ss 00:02:00 -t 10 -codec copy copy2.mp4 ffmpeg -i test_1280x720.mp4 -ss 00:03:00 -t 10…

Struts2初始化流程及源码分析

1.1 Struts2初始化 在讲Struts2的初始化之前&#xff0c;应该为大家描述下Web应用中的过滤器Filter&#xff0c;这关系到我们对核心过滤器FilterDispatcher的正确理解。 Filter&#xff1a;一个filter是一个对象&#xff0c;为每个请求资源(一个servlet或静态内容) &#xff0c…

实验1 数据库操作

实验1 数据库操作一、实验目的 1.掌握管理工具、T-SQL创建数据库的方法。 2.掌握管理工具、T-SQL修改和查看数据库的方法。 3.掌握管理工具、T-SQL删除数据库的方法。 4.掌握数据库的附加与分离 二、实验要求 1.创建实验所用到的“网上购物系统”数据库eshop。 三、实验内容 1…

Java FileInputStream finalize()方法与示例

FileInputStream类的finalize()方法 (FileInputStream Class finalize() method) finalize() method is available in java.io package. finalize()方法在java.io包中可用。 finalize() method is used to assure that close() method of this FileInputStream invokes when th…

逆风飞扬,吴仁宏

摘自逆风飞扬,吴仁宏自传 它是一个从"生而自卑"到"个性飞扬"的故事&#xff0c;当然具有传奇色彩 中国人几千年都不是天生的赢家&#xff0c;让我们努力&#xff0c;为国为家为自己&#xff0c;做赢家&#xff01; 生存哲学 尼采 痛苦,挫折使生命迁长,使人…

ffmpeg 命令图片和视频相互转换

1当前文件环境&#xff1a; ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp 使用ffplay test.jpb ffplay test.bmp 都是可以打开的 参数介绍&#xff1a; -y 如…

如何点击链接直接跳转到app store指定应用下载页面

转载自&#xff1a;http://blog.csdn.net/zengconggen/article/details/6789420 NSString *str [NSString stringWithFormat:"http://itunes.apple.com/us/app/id%d", 436957167]; [[UIApplication sharedApplication] openURL:[NSURL urlWithString:str]];其中&…

COLLEGE.sql(复制的时候注意路径!!!)

USE [master] GO /****** Object: Database [COLLEGE] Script Date: 2019/11/25 星期一 上午 08:57:11 / CREATE DATABASE [COLLEGE] ON PRIMARY ( NAME N’COLLEGE_m’, FILENAME N’F:\COLLEGE\COLLEGE.mdf’ , SIZE 51200KB , MAXSIZE UNLIMITED, FILEGROWTH 10240KB )…

【管理】「本能叛逆」与「理性叛逆」

叛逆是一般人认知的负面名词&#xff0c;但是&#xff0c;很多人都忽略掉&#xff0c;它却是人类进步的重要因子。观察孩童的成长过程&#xff0c;十岁以后都会出现叛逆行为&#xff0c;相当令父母及师长头痛。然而&#xff0c;叛逆却是促使孩童突破家庭单一环境养成的认知与观…

Java Double类parseDouble()方法的示例

Double类parseDouble()方法 (Double class parseDouble() method) parseDouble() method is available in java.lang package. parseDouble()方法在java.lang包中可用。 parseDouble() method is used to return the double value corresponding to the given String or in oth…

ffmpeg命令 拉流

1&#xff1a; 拉流播放:rtmp &#xff08;ffplay rtmp://server/live/streamName&#xff09; ffplay -x 480 -y 320 rtmp://58.200.131.2:1935/livetv/cctv1 2&#xff1a; 拉流存储到文件:rtmp ffmpeg -i rtmp://58.200.131.2:1935/livetv/cctv1 -codec copy cctvrtmp.f…