国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

  問題的根源是什么?是我們沒有一種有效的方式來組織js程序,使得它能夠遵循一些基本的面向?qū)ο笏枷?。然而,js并非沒有辦法體現(xiàn)出這些思想,本文試圖用某些特殊的組織方式來讓js符合基本的面向?qū)ο筇匦裕瑸檫M(jìn)一步應(yīng)用軟件工程的某些設(shè)計(jì)模式作鋪墊。

  Jscript中內(nèi)置了一些類,例如String、Array、Math等,用戶可以直接從這些類實(shí)例化出對(duì)象,并使用其中的屬性和方法。單憑這一點(diǎn),不能說js符合面向?qū)ο笳Z言的特征。一種面向?qū)ο蟮恼Z言,應(yīng)當(dāng)具有封裝,繼承,多態(tài)等基本特性。Jscript并沒有直接提供實(shí)現(xiàn)這些特性的方法,但是,也并非完全無法實(shí)現(xiàn)。

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

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

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


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

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


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

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

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


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

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

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

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


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

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


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

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

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

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

示例3-1:該例子創(chuàng)建了一個(gè)基類跟一個(gè)子類,擁有一個(gè)同名方法,分別將基類和子類實(shí)例化并調(diào)用這個(gè)方法,顯示的結(jié)果將隨著方法所屬類的不同而不同。原因很簡單,因?yàn)槔邮褂玫倪@種“繼承”機(jī)制本身就是利用js語言的動(dòng)態(tài)特性實(shí)現(xiàn)的,在一個(gè)類實(shí)例化的時(shí)候,它已經(jīng)知道自己擁有哪些方法,而且,它也不關(guān)心這些方法從哪個(gè)類繼承,只是將它們作為普通的成員方法來調(diào)用,所以,每一個(gè)類調(diào)用的同名方法都是屬于自己的那個(gè)。再者,js是弱類型語言,它的變量聲明的時(shí)候并不知道自己的類型,也并不知道將要被初始化成什么類型,賦予它什么類型的值,它就是什么類型的變量。本例子中分別注釋掉的兩段語句就說明了這個(gè)問題:Js在運(yùn)行時(shí)既能夠?qū)⒆宇愖兞抠x給基類變量(這個(gè)特性在C++等語言中正是實(shí)現(xiàn)多態(tài)的關(guān)鍵),也可以將基類變量賦給子類變量(一般在靜態(tài)語言中不允許,因?yàn)槿鄙俑郊有畔ⅲ?br>
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運(yùn)行]


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

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

聯(lián)系客服