亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript的面向對象編程基礎

2019-11-20 11:50:06
字體:
來源:轉載
供稿:網友

重新認識面向對象
為了說明 JavaScript 是一門徹底的面向對象的語言,首先有必要從面向對象的概念著手 , 探討一下面向對象中的幾個概念:

  1. 一切事物皆對象
  2. 對象具有封裝和繼承特性
  3. 對象與對象之間使用消息通信,各自存在信息隱藏

以這三點做為依據,C++ 是半面向對象半面向過程語言,因為,雖然他實現了類的封裝、繼承和多態,但存在非對象性質的全局函數和變量。Java、C# 是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。但這里函數本身是一個過程,只是依附在某個類上。

然而,面向對象僅僅是一個概念或者編程思想而已,它不應該依賴于某個語言存在。比如 Java 采用面向對象思想構造其語言,它實現了類、繼承、派生、多態、接口等機制。但是這些機制,只是實現面向對象編程的一種手段,而非必須。換言之,一門語言可以根據其自身特性選擇合適的方式來實現面向對象。所以,由于大多數程序員首先學習或者使用的是類似 Java、C++ 等高級編譯型語言(Java 雖然是半編譯半解釋,但一般做為編譯型來講解),因而先入為主地接受了“類”這個面向對象實現方式,從而在學習腳本語言的時候,習慣性地用類式面向對象語言中的概念來判斷該語言是否是面向對象語言,或者是否具備面向對象特性。這也是阻礙程序員深入學習并掌握 JavaScript 的重要原因之一。
實際上,JavaScript 語言是通過一種叫做 原型(prototype)的方式來實現面向對象編程的。下面就來討論 基于類的(class-based)面向對象和 基于原型的 (prototype-based) 面向對象這兩種方式在構造客觀世界的方式上的差別。
基于類的面向對象和基于原型的面向對象方式比較
在基于類的面向對象方式中,對象(object)依靠 類(class)來產生。而在基于原型的面向對象方式中,對象(object)則是依靠 構造器(constructor)利用 原型(prototype)構造出來的。舉個客觀世界的例子來說明二種方式認知的差異。例如工廠造一輛車,一方面,工人必須參照一張工程圖紙,設計規定這輛車應該如何制造。這里的工程圖紙就好比是語言中的 類 (class),而車就是按照這個 類(class)制造出來的;另一方面,工人和機器 ( 相當于 constructor) 利用各種零部件如發動機,輪胎,方向盤 ( 相當于 prototype 的各個屬性 ) 將汽車構造出來。
事實上關于這兩種方式誰更為徹底地表達了面向對象的思想,目前尚有爭論。但筆者認為原型式面向對象是一種更為徹底的面向對象方式,理由如下:
首先,客觀世界中的對象的產生都是其它實物對象構造的結果,而抽象的“圖紙”是不能產生“汽車”的,也就是說,類是一個抽象概念而并非實體,而對象的產生是一個實體的產生;
其次,按照一切事物皆對象這個最基本的面向對象的法則來看,類 (class) 本身并不是一個對象,然而原型方式中的構造器 (constructor) 和原型 (prototype) 本身也是其他對象通過原型方式構造出來的對象。
再次,在類式面向對象語言中,對象的狀態 (state) 由對象實例 (instance) 所持有,對象的行為方法 (method) 則由聲明該對象的類所持有,并且只有對象的結構和方法能夠被繼承;而在原型式面向對象語言中,對象的行為、狀態都屬于對象本身,并且能夠一起被繼承(參考資源),這也更貼近客觀實際。
最后,類式面向對象語言比如 Java,為了彌補無法使用面向過程語言中全局函數和變量的不便,允許在類中聲明靜態 (static) 屬性和靜態方法。而實際上,客觀世界不存在所謂靜態概念,因為一切事物皆對象!而在原型式面向對象語言中,除內建對象 (build-in object) 外,不允許全局對象、方法或者屬性的存在,也沒有靜態概念。所有語言元素 (primitive) 必須依賴對象存在。但由于函數式語言的特點,語言元素所依賴的對象是隨著運行時 (runtime) 上下文 (context) 變化而變化的,具體體現在 this 指針的變化。正是這種特點更貼近 “萬物皆有所屬,宇宙乃萬物生存之根本”的自然觀點。


JavaScript 面向對象基礎知識

雖然 JavaScript 本身是沒有類的概念,但它仍然有面向對象的特性,雖然和一般常見的面向對象語言有所差異。

簡單的創建一個對象的方法如下:

function myObject() {};JavaScript 中創建對象的方法一般來說有兩種:函數構造法和字面量法,上面這種屬函數構造法。下面是一個字面量法的例子:var myObject = {};

如果僅僅需要一個對象,而不需要對象的其它實例的情況下,推薦用字面量法。如果需要對象的多個實例,則推薦函數構造法。
定義屬性和方法

函數構造法:

function myObject() { this.iAm = 'an object'; this.whatAmI = function() { console.log('I am ' + this.iAm); };};

字面量法:

var myObject = { iAm : 'an object', whatAmI : function() { console.log('I am ' + this.iAm); }};

以上兩種方法創建的對象中,都有一個名為 “iAm” 的屬性,還有一個名為 “whatAmI” 的方法。屬性是對象中的變量,方法則是對象中的函數。

如何獲取屬性及調用方法:

var w = myObject.iAm;myObject.whatAmI();

調用方法的時候后面一定要加上括號,如果不加括號,那么它只是返回方法的引用而已。
兩種創建對象方法的區別

  •     函數構造法里面定義屬性和方法的時候,都要用前綴 this,字面量法不需要。
  •     函數構造法給屬性和方法賦值的時候用的是 =,字面量法用的是 : 。
  •     如果有多個屬性或方法,函數構造法里面用 ; 隔開,字面量法用 , 隔開。

對于字面量法創建的對象,可以直接用對象的引用調用其屬性或方法:

myObject.whatAmI();

而對于函數構造法而言,需要創建對象的實例,才能調用其屬性或方法:

var myNewObject = new myObject();myNewObject.whatAmI();

使用構造函數

現在再來回歸一下之前的函數構造法:

function myObject() { this.iAm = 'an object'; this.whatAmI = function() { console.log('I am ' + this.iAm); };};

其實它看起來就是個函數,既然是函數,能不能給它傳參數呢?將代碼再稍作修改:

function myObject(what) { this.iAm = what; this.whatAmI = function(language) { console.log('I am ' + this.iAm + ' of the ' + language + ' language'); };};

再將對象實例化,并傳入參數:

var myNewObject = new myObject('an object');myNewObject.whatAmI('JavaScript');

程序最終輸出 I am an object of the JavaScript language。
兩種創建對象的方法,我該用哪種?

對于字面量方法而言,因為它不需要實例化,所以如果修改了某對象的值,那么這個對象的值就永久地被修改了,其它任何地方再訪問,都是修改后的值。而對于函數構造法而言,修改值的時候是修改其實例的值,它可以實例化 N 個對象出來,每個對象都可以擁有自己不同的值,而且互不干擾。比較以下幾段代碼。

先看字面量法:

var myObjectLiteral = { myProperty : 'this is a property'};console.log(myObjectLiteral.myProperty); // log 'this is a property'myObjectLiteral.myProperty = 'this is a new property';console.log(myObjectLiteral.myProperty); // log 'this is a new property'

即便創建了一個新的變量指向這個對象,結果還是一樣的:

var myObjectLiteral = { myProperty : 'this is a property'};console.log(myObjectLiteral.myProperty); // log 'this is a property'var sameObject = myObjectLiteral;myObjectLiteral.myProperty = 'this is a new property';console.log(sameObject.myProperty); // log 'this is a new property'

再看函數構造法:

// 用函數構造法var myObjectConstructor = function() {   this.myProperty = 'this is a property'};// 實例化一個對象var constructorOne = new myObjectConstructor();// 實例化第二個對象var constructorTwo = new myObjectConstructor();// 輸出console.log(constructorOne.myProperty); // log 'this is a property'// 輸出console.log(constructorTwo.myProperty); // log 'this is a property'和預期一樣,兩個對象的屬性值是一樣的。如果修個其中一個對象的值呢?// 用函數構造法var myObjectConstructor = function() { this.myProperty = 'this is a property';};// 實例化一個對象var constructorOne = new myObjectConstructor();// 修改對象的屬性constructorOne.myProperty = 'this is a new property';// 實例化第二個對象var constructorTwo = new myObjectConstructor();// 輸出alert(constructorOne.myProperty); // log 'this is a new property'// 輸出alert(constructorTwo.myProperty); // log 'this is a property'

可以看到,用函數構造法實例化出來的不同對象,相互是獨立的,可以各自擁有不同的值。所以說,到底用哪種方法來創建對象,需取決于各自實際情況。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩一区二区免费视频| 欧美激情网站在线观看| 久久精品成人欧美大片古装| 综合网日日天干夜夜久久| 黑人巨大精品欧美一区二区三区| 亚洲aa在线观看| 欧美精品激情在线观看| 国产精品2018| 精品国产老师黑色丝袜高跟鞋| 亚洲成av人乱码色午夜| 国产一区二区在线免费视频| 日韩在线播放视频| 中文字幕日韩综合av| 7777免费精品视频| 精品久久在线播放| 97福利一区二区| 日韩网站在线观看| 亚洲影视中文字幕| 最近2019中文字幕在线高清| 亚洲xxxx视频| 国产精品pans私拍| 福利微拍一区二区| 国产精品户外野外| 日韩中文字幕在线视频| 黑人欧美xxxx| 91精品久久久久久久久久久久久| 日韩精品一区二区视频| 欧美在线视频网站| 国产亚洲精品高潮| 欧美激情一级欧美精品| 久久免费高清视频| 国内精品一区二区三区四区| 国产精品成人国产乱一区| 精品成人在线视频| 精品毛片网大全| 欧美精品videosex极品1| 欧美激情第一页xxx| 在线看福利67194| 亚洲精品影视在线观看| 欧美亚洲另类在线| 久久久久久一区二区三区| 国产亚洲欧洲黄色| 国产日韩欧美另类| 黑人狂躁日本妞一区二区三区| 永久555www成人免费| www日韩欧美| 亚洲美女久久久| 在线电影欧美日韩一区二区私密| 国产精品久久久久久久久久久久久久| 成人久久18免费网站图片| 影音先锋欧美在线资源| 日韩黄色在线免费观看| 国产精品成人品| 色悠悠久久88| 欧美激情日韩图片| 国产专区欧美专区| 国产日韩精品在线播放| 亚洲免费成人av电影| 久久亚洲精品中文字幕冲田杏梨| 亚洲精品久久久久久久久久久久| 庆余年2免费日韩剧观看大牛| 欧美国产日韩二区| 一区二区中文字幕| 欧美日本黄视频| 国产综合久久久久| 91精品国产综合久久男男| 亚洲男人天堂网站| 8090成年在线看片午夜| 亚洲精品久久久久国产| 亚洲精品视频在线观看视频| 成人黄色av网站| 动漫精品一区二区| 欧美午夜电影在线| 欧美疯狂性受xxxxx另类| 久久91精品国产91久久跳| 国产精品第1页| 亚洲欧美精品一区| 91av视频在线| 欧美精品www在线观看| 亚洲天堂av在线播放| 精品国产一区久久久| 欧美成人精品激情在线观看| 国产欧美日韩高清| 亚洲美女视频网站| 午夜精品一区二区三区视频免费看| 久久久久久美女| 亚洲片国产一区一级在线观看| 国产精品自产拍在线观看中文| 久久伊人精品一区二区三区| 日韩视频在线一区| 92福利视频午夜1000合集在线观看| 亚洲高清在线观看| 亚洲色图13p| 岛国av午夜精品| 亚洲高清不卡av| 精品亚洲一区二区三区四区五区| 国产成人一区二区三区| 神马久久久久久| 国产一区二区三区在线看| 亚洲精品成人久久电影| 日韩免费中文字幕| 少妇久久久久久| 青青草原一区二区| 一区二区三区日韩在线| 日韩精品亚洲元码| 欧美高清第一页| 日韩视频免费观看| 91精品国产91久久久久福利| 欧美大片免费观看在线观看网站推荐| 最新亚洲国产精品| 久久久久久久久久久成人| 日韩大片在线观看视频| 性欧美视频videos6一9| 欧美高清在线播放| 久久久久久久亚洲精品| 国产日韩在线一区| 亚洲最新视频在线| 日韩最新在线视频| 国产91在线播放九色快色| 亚洲天堂免费视频| 欧美一级大片在线观看| 欧美在线视频一区| 亚洲欧美福利视频| 91免费精品视频| 91成人天堂久久成人| 精品国产福利视频| 亚洲xxxxx| 国产精品视频99| 成人观看高清在线观看免费| 色噜噜亚洲精品中文字幕| 亚洲人成毛片在线播放| 久久久久久97| 久久久最新网址| 欧美肥臀大乳一区二区免费视频| 欧美在线视频网| 伊人精品在线观看| 亚洲电影天堂av| 日本亚洲欧美三级| 亚洲精品中文字幕av| 一本大道久久加勒比香蕉| 97成人精品视频在线观看| 午夜精品99久久免费| 影音先锋欧美在线资源| 136fldh精品导航福利| 亚洲国产精品久久91精品| 欧美最猛性xxxxx免费| 亚洲精品福利资源站| 亚洲欧美在线免费观看| 国产成人激情小视频| 欧美日韩激情网| 亚洲人午夜精品| 九色91av视频| 黄色精品一区二区| 久久国产一区二区三区| 欧美黄色小视频| 亚洲日韩中文字幕在线播放| 日韩精品极品视频| 亚洲精品一区二区三区婷婷月| 精品亚洲国产成av人片传媒| 91理论片午午论夜理片久久| 日韩av在线播放资源| 欧美在线激情视频| 午夜精品一区二区三区在线视| 欧美日韩美女视频|