• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      JavaScript的面向?qū)ο筇匦苑治?/h1>
      2017-07-14 14:38:20劉蓮花陳瑛
      電腦知識與技術(shù) 2017年16期
      關(guān)鍵詞:面向?qū)ο?/a>函數(shù)

      劉蓮花+陳瑛

      摘要:傳統(tǒng)面向?qū)ο蟮脑O計模式強調(diào)基于類的概念,而JavaScript不使用類。這讓大多數(shù)開發(fā)者們在學習JavaScript的面向?qū)ο缶幊虝r候感到困惑。該文基于面向?qū)ο缶幊趟枷氲谋举|(zhì),將JavaScript面向?qū)ο筇匦耘c傳統(tǒng)面向?qū)ο笳Z言進行比較分析,深入討論了JavaScript的面向?qū)ο缶幊痰奶匦?。同時,用舉例的方法闡述JavaScript是如何實現(xiàn)面向?qū)ο筇匦缘?。通過該文的分析,有利于大家對JavaScript面向?qū)ο筇匦缘睦斫狻?/p>

      關(guān)鍵詞:JavaScript;面向?qū)ο螅辉蛯ο?;函?shù)

      是否精通JavaScript現(xiàn)已成為招聘Web開發(fā)人員的決定性因素。如果Web開發(fā)人員在面試時被問到這樣的問題:“JavaS-cript是一種面向?qū)ο笳Z言嗎?如果是,JavaScript中的繼承關(guān)系是如何實現(xiàn)的呢?在現(xiàn)實中,即使是做了很多年JavaScript開發(fā)的程序員對這個問題也說不清道不明。很多人能熟練地使用各種框架,但其代碼組織卻不是很理想,這是由于其對Ja-vaScript的原生語言特性如閉包、函數(shù)式編程、原型鏈等理解不夠深人。本人在文獻檢索時發(fā)現(xiàn),涉及JavaScript面向?qū)ο筇匦缘闹黝}文獻不到10篇,其中黃華林等人提出“JavaScript是基于對象的語言,而非完全面向?qū)ο蟮?。故JavaScript不可能實現(xiàn)面向?qū)ο笳Z言的所有特性”的觀點。這是對JavaScript面向?qū)ο筇匦缘恼`解。在有關(guān)JavaScript的著作中,題名出現(xiàn)“面向?qū)ο蟆弊謽拥牟怀^10本,很多關(guān)于JavaScript的經(jīng)典著作也只是用很小的篇幅來簡單闡述它的面向?qū)ο筇匦?。對JavaScript來說,大家關(guān)心的只是它的各種跨平臺應用,但不能因為JavaS-cript中沒有用到類,或沒有接口的概念,就認為它不是完全面向?qū)ο蟮摹G∏∠喾?,正是由于JavaScript的面向?qū)ο筇匦裕拍苋绱说撵`活,應用的如此廣泛。所以要真正理解JavaScript的面向?qū)ο筇匦?,應該基于面向?qū)ο缶幊趟枷氲谋举|(zhì),結(jié)合Ja-vaScript自身的特點,從函數(shù)式編程及原型對象的角度來分析它的面向?qū)ο蟮奶匦浴?/p>

      本文從三個方面來展開分析討論,一、面向?qū)ο缶幊趟枷氲谋举|(zhì),二、JavaScript與傳統(tǒng)基于類的面向?qū)ο笳Z言的比較分析,三、JavaScript面向?qū)ο髮崿F(xiàn)的舉例說明。

      1面向?qū)ο缶幊趟枷氲谋举|(zhì)

      面向?qū)ο缶幊趟枷氲谋举|(zhì)體現(xiàn)在——面向?qū)ο缶幊陶Z言必須包含這些特性:對象、屬性(變量)、行為(方法)、類、封裝、繼承、多態(tài)等。面向?qū)ο缶幊趟枷氲闹攸c在“對象”上,對象實質(zhì)上是“客觀事物”在程序設計語言中的表現(xiàn)形式,客觀事物可以是某個客觀存在的人或物,或者某些抽象的概念。事物的靜態(tài)特征稱之為屬性,而事物的動態(tài)行為或動作稱之為方法。將具有相同屬性和行為的一組對象的集合抽象成為類的概念,可以基于同一個類實例化許多不同的對象,類是模板,而對象是在這些模板的基礎上被創(chuàng)建出來的實體。封裝的本質(zhì)是為了實現(xiàn)信息的隱藏,就是把對象的屬性和行為結(jié)合成一個獨立的整體,這樣做可以將對象的設計與使用分開,使用對象時不用去關(guān)心其內(nèi)部的信息,只需通過傳遞消息來訪問對象。繼承是指在已經(jīng)存在的類的基礎上,構(gòu)造出新的類,它很好地實現(xiàn)了代碼復用。多態(tài)是指不同對象通過調(diào)用名字相同的方法來實現(xiàn)各自行為的能力,這符合現(xiàn)實生活的習慣和要求,而且可以使程序更加簡潔和一致。

      面向?qū)ο笫且环N不依賴于某種語言而存在的編程思想。Java通過關(guān)鍵詞class和extends很好地實現(xiàn)了面向?qū)ο缶幊蹋⒉皇钦f這一思想只能通過這種方式來實現(xiàn),一門編程語言可以借助其自身特點通過合適的某種方式來實現(xiàn)面向?qū)ο缶幊趟枷搿K?,不能先入為主地認為基于類來實現(xiàn)面向?qū)ο蟮恼Z言才是面向?qū)ο笳Z言,而像JavaScfipt這樣基于原型對象來實現(xiàn)面向?qū)ο蟮膭t不是面向?qū)ο笳Z言。實際上,JavaScript雖然沒有類的概念,沒有class和extends關(guān)鍵詞,但通過原型對象,它也實現(xiàn)了對象創(chuàng)建、封裝、繼承、多態(tài)等面向?qū)ο蟮奶匦?。下面就來討論基于類的面向?qū)ο蠛蚃avaScript基于原型對象的面向?qū)ο蟮牟顒e。

      2JavaScript與傳統(tǒng)基于類的面向?qū)ο蟮谋容^分析

      在基于類的面向?qū)ο蠓绞街?,通過類來創(chuàng)建多個同屬性和行為的對象。而ECMAScirpt中沒有類的概念,其中的對象與基于類的語言中的對象有所不同,ECMA-262將對象定義為:“無序?qū)傩缘募?,其屬性可以包含基本值、對象或者函?shù)。也就是說,JavaScript中的對象是一組“名一值”對,其中的值可以是數(shù)據(jù),也可以是函數(shù),當值是數(shù)據(jù)(變量)時,表示的是對象的屬性,當值為函數(shù)時,表示的是對象的行為(方法)。這種基于原型對象的面向?qū)ο蠓绞?,對象是通過構(gòu)造器函數(shù)利用原型對象構(gòu)造出來的。以生產(chǎn)制造一輛機動車為例來說明這兩種構(gòu)造對象方式的差異。機械工程師設計出機動車的構(gòu)造圖紙,圖紙詳細規(guī)定了制作工藝及組裝流程,工人依照圖紙來生產(chǎn)制造。本例中的圖紙就好比是基于類的面向?qū)ο笳Z言中的類,而某輛車就是按照這個類制造出來的對象;而另一面,工人和機器利用各種零部件如發(fā)動機、車輪等將機動車組裝制造出來,這里的零部件就如同是面向?qū)ο笾械膶傩裕梢允歉鞣N原生原型或?qū)ο螅?,而機器相當于是構(gòu)造器函數(shù)。

      回到客觀世界中,任意一個對象的產(chǎn)生都是通過其他已存在實物對象構(gòu)造的結(jié)果,而抽象的“圖紙”是不能產(chǎn)生“車子”的,也就是說,類是一個抽象概念而并非實體,而對象的構(gòu)造是一個實體的產(chǎn)生;按照一切事物皆對象這個最基本的面向?qū)ο蟮姆▌t來看,類本身并不是一個對象,而原型方式中的構(gòu)造器和原型本身則是其他對象通過原型方式構(gòu)造出來的對象。這更符合人們看待客觀世界的方式,更能徹底地體現(xiàn)面向?qū)ο缶幊痰乃枷?。再者,在基于類的面向?qū)ο笳Z言中,對象的屬性值由每一個對象實例所獨有,而對象的行為方法卻統(tǒng)一在類內(nèi)聲明,由類擁有,在繼承時,子類對象只能繼承父類對象的結(jié)構(gòu)和方法。而在基于原型的面向?qū)ο笳Z言中,對象的行為、屬性都屬于對象本身,并且能夠一起被繼承,這也更貼近客觀實際。

      所以面向?qū)ο蟮木幊趟枷氤四芡ㄟ^類來實現(xiàn)外,也可以通過其他的方式來實現(xiàn),其中JavaScript就是這樣的一種基于原型對象的面向?qū)ο笳Z言,在接受了這一觀點后,下面我們就舉例來說明JavaScript是如何通過原型對象來實現(xiàn)面向?qū)ο蟮母鞣N特性。

      3基于原型對象實現(xiàn)面向?qū)ο蟮呐e例

      3.1對象的創(chuàng)建

      對象是面向?qū)ο缶幊痰暮诵?,比如:要定義一個機動車類,名字叫Vehicle,有兩個屬性:speed和wheelnum,另外有兩個方法:一個~how0方法,用于顯示機動車當前的信息,一個speedup()方法,用于加速,那么用Java語言可以如下來實現(xiàn):

      3.2封裝的實現(xiàn)

      封裝是面向?qū)ο缶幊讨械闹匾拍钪?。下面我們通過一個具體的例子來討論JavaScript是如何實現(xiàn)封裝特性的。

      在原型對象內(nèi)部定義的屬性和方法,其作用域只在原型內(nèi)部,外部不能訪問,這樣的屬性就是私有屬性,方法就是私有方法。而在原型對象內(nèi)部定義帶有this修飾的屬性和方法,或是通過原型對象的原生原型定義的屬性和方法,其作用域不僅限于原型對象內(nèi)部,那么這些屬性和方法將成為公有屬性和方法。在JavaScript中,對象的屬性和方法可以動態(tài)地添加,正是因為這個,其要定義靜態(tài)屬性和方法是很容易的事情。

      3.3繼承的實現(xiàn)

      JavaScript中沒有實現(xiàn)繼承的關(guān)鍵詞extends,也沒有嚴格地定義抽象類,但JavaScript通過語言本身的特性實現(xiàn)了繼承。它支持多重繼承,而且實現(xiàn)繼承的方式也有很多種,如:對象冒充、通過call或apply、原型鏈及多種混合的方式,下面通過原型鏈的方式來實現(xiàn)繼承,代碼如下:

      這種方式是通過創(chuàng)建一個父級對象賦給子級的prototype屬性,子級對象就擁有了父級對象中的屬性和方法,即實現(xiàn)了繼承…。每個對象實例都有一個內(nèi)部屬性prototype,通過這個屬性跟蹤其原型對象,子級的原型對象的內(nèi)部屬性prototype獲得了父級的一個對象實例,繼續(xù)跟蹤到了父級的原型對象,如此就形成了一個原型鏈。

      3.4多態(tài)的實現(xiàn)

      多態(tài)主要是通過方法的重載和覆蓋來實現(xiàn)。重載是指名字相同的方法可以有多種不同的實現(xiàn),主要通過參數(shù)的類型、參數(shù)的個數(shù)及參數(shù)的順序的不同來識別。而JavaScript在函數(shù)定義時可以不指定函數(shù)參數(shù)的類型和個數(shù),所以說它的本性就支持重載。而覆蓋是指子類中可以定義與父類同簽名的方法,子類對象調(diào)用這些方法時,從父類中繼承過來的同名方法將被隱藏。

      在上述實現(xiàn)繼承的例子中,再定義一個car的子類(原型對象),實現(xiàn)代碼如下:

      4結(jié)束語

      傳統(tǒng)基于類的面向?qū)ο笏季S在一定程度上妨礙了大家對JavaSeript面向?qū)ο筇匦缘睦斫?,本文對面向?qū)ο缶幊痰谋举|(zhì)進行了分析,通過比較分析及舉例說明的研究方法深入討論了JavaScript的面向?qū)ο筇匦?。它的弱類型,簡單易用性、解釋性及跨平臺性,使其在Web的應用開發(fā)中可以說是無處不在,但它的無類動態(tài)對象、原型鏈繼承、閉包等特性使其具有更高的靈活性。所以徹底地理解并應用JavaScript的面向?qū)ο筇匦允欠浅S幸饬x和有必要的。

      猜你喜歡
      面向?qū)ο?/a>函數(shù)
      二次函數(shù)
      第3講 “函數(shù)”復習精講
      二次函數(shù)
      函數(shù)備考精講
      面向?qū)ο蟮挠嬎銠C網(wǎng)絡設計軟件系統(tǒng)的開發(fā)
      電子測試(2018年15期)2018-09-26 06:01:34
      面向?qū)ο蟮臄?shù)據(jù)交換協(xié)議研究與應用
      面向?qū)ο骔eb開發(fā)編程語言的的評估方法
      面向?qū)ο笮畔⑻崛≈杏跋穹指顓?shù)的選擇
      河南科技(2014年10期)2014-02-27 14:09:03

      土默特右旗| 紫金县| 五峰| 陵水| 扎鲁特旗| 章丘市| 葫芦岛市| 淮阳县| 南和县| 诏安县| 汕尾市| 台北市| 闻喜县| 霍林郭勒市| 廉江市| 杭锦后旗| 沁源县| 浦江县| 建德市| 柳河县| 铁岭市| 昔阳县| 泸水县| 保康县| 潜江市| 龙州县| 蓬安县| 石首市| 务川| 通河县| 印江| 九江县| 收藏| 阳山县| 武穴市| 江川县| 宿州市| 铜川市| 兖州市| 厦门市| 贵定县|