面向對象的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.pswp.cn/news/379385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379385.shtml
英文地址,請注明出處:http://en.pswp.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…