欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
【原創(chuàng )】面向對象的Jscript
在web頁(yè)面的客戶(hù)端應用中,js已經(jīng)成為不可缺少的部分。傳統方式對js的應用完全基于過(guò)程模型,在這種模型里,普通語(yǔ)句及全局函數的使用最為普遍。當代碼的數量逐漸增加,整個(gè)項目的維護就變得困難,邏輯也漸漸超出設計者的掌控,這個(gè)時(shí)候,我們需要借用軟件工程的觀(guān)念來(lái)管理項目?,F代軟件工程的根基是組件化、對象化的程序設計,由UML設計圖指導的程序設計過(guò)程有條不紊地進(jìn)行著(zhù)。令人苦惱的是,當現代軟件工程的理念滲入web項目的時(shí)候,卻遇到了很大的問(wèn)題,幾乎沒(méi)有辦法發(fā)揮它的威力。

  問(wèn)題的根源是什么?是我們沒(méi)有一種有效的方式來(lái)組織js程序,使得它能夠遵循一些基本的面向對象思想。然而,js并非沒(méi)有辦法體現出這些思想,本文試圖用某些特殊的組織方式來(lái)讓js符合基本的面向對象特性,為進(jìn)一步應用軟件工程的某些設計模式作鋪墊。

  Jscript中內置了一些類(lèi),例如String、Array、Math等,用戶(hù)可以直接從這些類(lèi)實(shí)例化出對象,并使用其中的屬性和方法。單憑這一點(diǎn),不能說(shuō)js符合面向對象語(yǔ)言的特征。一種面向對象的語(yǔ)言,應當具有封裝,繼承,多態(tài)等基本特性。Jscript并沒(méi)有直接提供實(shí)現這些特性的方法,但是,也并非完全無(wú)法實(shí)現。

一、Js中的封裝
  一種面向對象的語(yǔ)言應當允許用戶(hù)創(chuàng )建自定義類(lèi)型,這一點(diǎn)js做到了,只是它的自定義類(lèi)型不是用class限定,而是作為function,這個(gè)function的作用相當于其他語(yǔ)言中的構造函數。在自定義類(lèi)型中,用戶(hù)可以添加屬性、方法。但是,js中并未顯式提供public、private、protected等訪(fǎng)問(wèn)限定,也沒(méi)有提供static之類(lèi)的作用域限定。下面通過(guò)幾個(gè)例子,逐一說(shuō)明創(chuàng )建自定義類(lèi)型及實(shí)現各種限定的方法。

示例1-1:該例子演示了創(chuàng )建及使用包含屬性和方法的自定義類(lèi)型的過(guò)程。本例子中,我們創(chuàng )建了一個(gè)名為MyClass的類(lèi),其中包含了一個(gè)Name屬性和一個(gè)showName方法,然后將這個(gè)類(lèi)實(shí)例化,即可調用其中的方法,使用其中的屬性。注意,在類(lèi)中定義的方法和屬性應當使用this關(guān)鍵字綁定到這個(gè)類(lèi),調用時(shí)使用綁定名字來(lái)訪(fǎng)問(wèn),而不是通過(guò)實(shí)際名字。

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]


示例1-2:該例子演示了public和private訪(fǎng)問(wèn)限定的實(shí)現。本例子中,我們修改了上個(gè)例子中的MyClass類(lèi),將其擴充為兩個(gè)屬性和兩個(gè)方法。注意到PrivateName的聲明,它并沒(méi)有綁定到這個(gè)類(lèi),因此只具有局部作用域,生命期僅在本類(lèi)中,如果在類(lèi)的方法中調用它的話(huà),是可以正常調用的(調用的時(shí)候不加this關(guān)鍵字)。同理,沒(méi)有綁定的方法也只能在類(lèi)的內部調用。因此,js中的public與private限定可以通過(guò)這種方式來(lái)實(shí)現。

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]


  在這里,需要注意到一個(gè)現象,既然js把類(lèi)本身作為一個(gè)構造函數,它在實(shí)例化的時(shí)候將逐個(gè)執行其中的語(yǔ)句,保留其中的方法定義,一直把整個(gè)函數執行完。因此,本例子中注釋掉的writePrivateName();語(yǔ)句如果正常執行,將在MyClass類(lèi)實(shí)例化的時(shí)候運行。

示例1-3:該例子演示了static限定的實(shí)現。本例子中,我們將MyClass類(lèi)修改為帶一個(gè)普通屬性、一個(gè)靜態(tài)屬性和兩個(gè)靜態(tài)方法的類(lèi)。這個(gè)類(lèi)可以被實(shí)例化,所能夠訪(fǎng)問(wèn)的僅僅是在類(lèi)中定義的普通屬性。當不實(shí)例化,通過(guò)類(lèi)名訪(fǎng)問(wèn)的時(shí)候,可以訪(fǎng)問(wèn)類(lèi)中的靜態(tài)方法和靜態(tài)屬性,靜態(tài)方法只能訪(fǎng)問(wèn)靜態(tài)屬性。與C++類(lèi)似,靜態(tài)成員的初始化需要在類(lèi)的外面進(jìn)行。

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]


  通過(guò)以上三個(gè)示例,我們能夠看出,js很好地支持了封裝,并且支持了基本的訪(fǎng)問(wèn)限定。

二、Js中的繼承
  繼承是面向對象語(yǔ)言中擴展已有類(lèi)型的一種有效途徑,js沒(méi)有提供用于實(shí)現繼承的extends關(guān)鍵字或者“:”操作符,但是,由于它是一種動(dòng)態(tài)語(yǔ)言,可以在需要的時(shí)候添加屬性和方法。以下示例中繼承機制的實(shí)現均基于這種原理。

示例2-1:該例子演示了從基類(lèi)派生出一個(gè)子類(lèi)的方法。子類(lèi)中創(chuàng )建了基類(lèi)的對象,為它添加了新的屬性和方法,然后將它作為子類(lèi)構造函數的結果返回出去,得到子類(lèi)對象。子類(lèi)對象比基類(lèi)對象多了一些屬性和方法,分配到了更多內存空間。注意到每次輸出的constructor屬性的值,發(fā)現它們兩次返回的都是基類(lèi)的構造函數,這并不奇怪,因為子類(lèi)的構造函數最后返回的是添加了新屬性、新方法的基類(lèi)對象,js執行環(huán)境仍然會(huì )認為它是一個(gè)基類(lèi)對象。

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]


示例2-2:該例子演示了從兩個(gè)不同基類(lèi)派生出一個(gè)子類(lèi)的方法。子類(lèi)中分別創(chuàng )建了兩個(gè)基類(lèi)的對象,將其中一個(gè)的所有屬性和方法添加到另外一個(gè)上,然后將后者作為子類(lèi)構造函數的結果返回出去,得到子類(lèi)對象。通過(guò)這種途徑,變相地實(shí)現了多重繼承。這里有一個(gè)注意點(diǎn),不同的基類(lèi)中如果包含同名變量或方法,需要自己指定以哪個(gè)作為實(shí)際綁定。

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]


  通過(guò)以上兩個(gè)示例能夠看出,js其實(shí)支持了繼承的機制,只不過(guò)這種機制需要更多的手工控制。

  既然提到繼承,順便討論一下protected限定,它的作用是使得被限定的變量或方法不能被類(lèi)的實(shí)例調用,但是能夠被派生類(lèi)調用。寫(xiě)這篇文章的時(shí)候本人曾經(jīng)花了不少時(shí)間來(lái)考慮是否有可能使用js模擬出這種限定,后來(lái)發(fā)現,既然public跟private限定是通過(guò)指定綁定來(lái)實(shí)現的,那么,沒(méi)法創(chuàng )建一種介于綁定和不綁定之間的關(guān)系,也就不好用這種方式模擬。再轉念一想,protected限定幾乎都是實(shí)現在編譯型的語(yǔ)言中。在目標代碼或者中間代碼層次,這種限定非常重要,它能夠有效配合軟件工程理論進(jìn)行開(kāi)發(fā),但是js是純解釋型語(yǔ)言,源代碼公開(kāi)的級別,不存在有效的模塊保護機制,任何人可以隨意修改代碼,這樣,protected關(guān)鍵字完全沒(méi)有用武之地。

  C++等語(yǔ)言擁有一種特殊類(lèi):接口。接口的作用是為類(lèi)提供規范、約束,它規定了繼承這個(gè)接口所必須實(shí)現的方法集合。我們當然可以實(shí)現這樣一個(gè)機制,當類(lèi)繼承接口的時(shí)候,檢查它是否實(shí)現了接口中的全部方法,或者是否提供了這些方法的聲明,但這種做法并不必要。當繼承這個(gè)接口的時(shí)候,根據上面實(shí)現的這種繼承機制,將會(huì )直接創(chuàng )建接口的一個(gè)對象(有的語(yǔ)言中禁止把接口實(shí)例化),這個(gè)時(shí)候,它已經(jīng)包含了接口中所定義的方法集合,即使不重新定義這些方法并綁定,他們顯然已經(jīng)被聲明了,而且,js不提供一個(gè)機制用于識別抽象方法,接口中的方法是否已被實(shí)現也無(wú)從得知。

三、Js中的多態(tài)
  多態(tài)能夠讓對象在運行時(shí)決定實(shí)際調用的方法體。由于js是一種動(dòng)態(tài)語(yǔ)言,支持運行時(shí)綁定,討論它的多態(tài)實(shí)際上并沒(méi)有太大意義。Js不支持virtual關(guān)鍵字,而virtual關(guān)鍵字在現在的js里面也不會(huì )有明顯用處。最根本的一點(diǎn),js能夠在運行時(shí)改變數據類(lèi)型,可以隨時(shí)根據新類(lèi)型來(lái)取得它所擁有的方法,而忽視原有類(lèi)型的影響。

示例3-1:該例子創(chuàng )建了一個(gè)基類(lèi)跟一個(gè)子類(lèi),擁有一個(gè)同名方法,分別將基類(lèi)和子類(lèi)實(shí)例化并調用這個(gè)方法,顯示的結果將隨著(zhù)方法所屬類(lèi)的不同而不同。原因很簡(jiǎn)單,因為例子使用的這種“繼承”機制本身就是利用js語(yǔ)言的動(dòng)態(tài)特性實(shí)現的,在一個(gè)類(lèi)實(shí)例化的時(shí)候,它已經(jīng)知道自己擁有哪些方法,而且,它也不關(guān)心這些方法從哪個(gè)類(lèi)繼承,只是將它們作為普通的成員方法來(lái)調用,所以,每一個(gè)類(lèi)調用的同名方法都是屬于自己的那個(gè)。再者,js是弱類(lèi)型語(yǔ)言,它的變量聲明的時(shí)候并不知道自己的類(lèi)型,也并不知道將要被初始化成什么類(lèi)型,賦予它什么類(lèi)型的值,它就是什么類(lèi)型的變量。本例子中分別注釋掉的兩段語(yǔ)句就說(shuō)明了這個(gè)問(wèn)題:Js在運行時(shí)既能夠將子類(lèi)變量賦給基類(lèi)變量(這個(gè)特性在C++等語(yǔ)言中正是實(shí)現多態(tài)的關(guān)鍵),也可以將基類(lèi)變量賦給子類(lèi)變量(一般在靜態(tài)語(yǔ)言中不允許,因為缺少附加信息)。

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]


四、總結
  綜合以上分析,js勉強能夠算是一種面向對象的語(yǔ)言,因此,也可以將一些軟件工程的思想應用到開(kāi)發(fā)中,使得整個(gè)項目的架構穩定,邏輯清晰。51js論壇的萬(wàn)常華前輩作出了很大的努力,他將js的面向對象特性設計成一種規則,模仿java的包-類(lèi)結構,做出了一些由這種規則支撐的常用類(lèi)庫,經(jīng)過(guò)一段時(shí)間的努力和完善,已經(jīng)可以初步進(jìn)行應用了。

  附記:寫(xiě)這篇文章來(lái)源于一個(gè)靈感,在學(xué)習設計模式的時(shí)候,我聯(lián)想到目前web程序設計中的諸多不規范情況,多數人依然使用傳統的過(guò)程化結構來(lái)控制整個(gè)項目,當項目越做越大的時(shí)候常有力不從心的感覺(jué)?;靵y的設計、到處隱藏的bug,這一切注定無(wú)法避免么?于是,我嘗試用面向對象的思路來(lái)重新看待js,并期望以后能夠在這個(gè)基礎上,將一些設計模式應用到web程序設計上來(lái),在界面設計與事務(wù)處理分離的前提下,讓整個(gè)項目的架構趨于合理、穩定。寫(xiě)這篇文章的時(shí)候,我并不知道到底我對js了解了多少,也不知道我的理解是否包含了嚴重的錯誤,這一切只是一個(gè)探索,也希望大家能夠賜教,或者給出好的建議。本人是東南大學(xué)計算機系大四的學(xué)生,碰巧的是,這學(xué)期軟件體系結構課程老師要求自由選題寫(xiě)一篇論文,花了一個(gè)星期時(shí)間,希望沒(méi)有讓老師失望,呵呵。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JavaScript獲取圖片的原始尺寸
前端教程:JavaScript while循環(huán)
讓Flash調用符合web標準—Flash教程
js document.write 的應用
Javascript取一個(gè)月的最后一天
JavaScript基本語(yǔ)法
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久