亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

JavaScript中的原型和繼承詳解(圖文)
來源:易賢網 閱讀:1786 次 日期:2014-07-22 19:57:25
溫馨提示:易賢網小編為您整理了“JavaScript中的原型和繼承詳解(圖文)”,方便廣大網友查閱!

到現在,我們就有討論 JavaScript 中的原型和繼承問題的基礎了。它雖然并不像你在 C++、Java 或 C# 中了解的經典繼承模式一樣,但這種方式同樣強大,并且有可能會更加靈活。

有關對象和類

JavaScript 中全是對象,這指的是傳統意義上的對象,也就是“一個包含了狀態和行為的單一實體”。例如,JavaScript 中的數組是含有數個值,并且包含 push、reverse 和 pop 方法的對象。

var myArray = [1, 2];

myArray.push(3);

myArray.reverse();

myArray.pop();

var length = myArray.length;

現在問題是,push 這樣的方法是從何而來的呢?我們前面提到的那些靜態語言使用“類語法”來定義對象的結構,但是 JavaScript 是一個沒有“類語法”的語言,無法用 Array“類”的語法來定義每個數組對象。而因為 JavaScript 是動態語言,我們可以在實際需要的情況下,將方法任意放置到對象上。例如下面的代碼,就在二維空間中,定義了用來表示一個點的點對象,同時還定義了一個 add 方法。

var point = {

  x : 10,

  y : 5,

  add: function(otherPoint) {

    this.x += otherPoint.x;

    this.y += otherPoint.y;

  }

};

但是上面的做法可擴展性并不好。我們需要確保每一個點對象都含有一個 add 方法,同時也希望所有點對象都共享同一個 add 方法的實現,而不是這個方法手工添加每一個點對象上。這就是原型發揮它作用的地方。

有關原型

在 JavaScript 中,每個對象都保持著一塊隱藏的狀態 —— 一個對另一個對象的引用,也被稱作原型。我們之前創建的數組引用了一個原型對象,我們自行創建的點對象也是如此。上面說原型引用是隱藏的,但也有 ECMAScript(JavaScript 的正式名稱)的實現可以通過一個對象的__proto__屬性(例如谷歌瀏覽器)訪問到這個原型引用。從概念上講,我們可以將對象當作類似于 圖1 所表示的對象 —— 原型的關系。

1

圖1

展望未來,開發者將能夠使用 Object.getPrototypeOf 函數,代替__proto__屬性,取得對象原型的引用。在本文寫出的時候,已經可以在 Google Chrome,FIrefox 和 IE9 瀏覽器中使用 Object.getPrototypeOf 函數。更多瀏覽器在未來會實現此功能,因為它已經是 ECMAScript 標準的一部分了。我們可以使用下面的代碼,來證明我們建立的 myArray 和點對象引用的是兩個不同的原型對象。

Object.getPrototypeOf(point) != Object.getPrototypeOf(myArray);

對于本文的其余部分,我將交叉使用 __proto__和Object.getPrototypeOf 函數,主要是因為 __proto__ 在圖和句子中更容易識別。需要記住的是它(__proto__)不是標準,而 Object.getPrototypeOf 函數才是查看對象原型的推薦方法。

是什么讓原型如此特別?

我們還沒有回答這個問題:數組中 push 這樣的方法是從何而來的呢?答案是:它來源于 myArray 原型對象。圖 2 是 Chrome 瀏覽器中腳本調試器的屏幕截圖。我們已經調用 Object.getPrototypeOf 方法查看 myArray 的原型對象。

2

圖 2

注意 myArray 的原型對象中有許多方法,包括那些在代碼示例中調用的 push、pop 和 reverse 方法。因此,原型對象中的確包括 push 方法,但是 myArray 方法如何引用到呢?

myArray.push(3);

了解其工作原理的第一步,是要認識到原型并不是特別的。原型只是普通的對象。可以給原型添加方法,屬性,并把他們當作其他 JavaScript 對象一樣看待。然而,套用喬治·奧威爾的小說《動物農場》中“豬”的說法 —— 所有的對象應當是平等的,但有些對象(遵守規則的)比其他人更加平等。

JavaScript 中的原型對象的確是特殊的,因為他們遵從以下規則。當我們告訴 JavaScript 我們要調用一個對象的 push 方法,或讀取對象的 x 屬性時,運行時會首先查找對象本身。如果運行時找不到想要的東西,它就會循著 __proto__ 引用和對象原型尋找該成員。當我們  調用 myArray 的 push 方法時,JavaScript 并沒有在 myArray 對象上發現 push 方法,而是在 myArray 的原型對象上找到了,于是 JavaScript 調用此方法(見圖 3)。

3

圖3上面所描述的行為是指一個對象本身繼承了原型上的任何方法或屬性。JavaScript 中其實不需要使用類語法也能實現繼承。就像從賽車原型上繼承了相應的技術的車,一個 JavaScript 對象也可以從原型對象上繼承功能特性。

圖 3 還展示了每個數組對象同時也可以維護自身的狀態和成員。在請求得到 myArray 的 length 屬性的情況下,JavaScript 會取得 myArray 中 length 屬性的值,而不會去讀取原型中的對應值。我們可以通過向對象上添加 push 這樣的方法來“重寫”push 方法。這樣就會有效地隱藏原型中的 push 方法實現。

共享原型

JavaScript 中原型的真正神奇之處是多個對象如何維持對同一個原型對象的引用。例如,如果我們創建了這樣的兩個數組:

var myArray = [1, 2];

var yourArray = [4, 5, 6];

那么這兩個數組將共享同一個原型對象,而下面的代碼計算結果為 true:

Object.getPrototypeOf(myArray) === Object.getPrototypeOf(yourArray);

如果我們引用兩個數組對象上的 push 方法,JavaScript 會去尋找原型上共享的 push 方法。

4

圖 4

JavaScript 中的原型對象提供繼承功能,同時也就實現了該方法實現的共享。原型也是鏈式的。換句話說,因為原型對象只是一個對象,所以一個原型對象可以維持到另一個原型對象的引用。如果你重新審視圖 2 便可以看到,原型的 __proto__ 屬性是一個指向另一個原型的非空值。當 JavaScript 查找像 push 方法這樣的成員時,它會循著原型引用鏈檢查每一個對象,直到找到該成員,或者抵達原型鏈的末端。原型鏈為繼承和共享開辟了一條靈活的途徑。

你可能會問的下一個問題是:我該如何設置那些自定義對象的原型引用呢?例如前面所使用的點對象,如何才能將 add 方法添加到原型對象中,并從多個點對象中繼承方法呢?在回答這個問題之前,我們需要看看函數。

有關函數

JavaScript 中的函數也是對象。這樣的表述帶來了幾個重要的結果,而我們并不會在本文中涉及所有的事項。這其中,能將一個函數賦值給一個變量,并且將一個函數作為參數傳遞給另一個函數的能力構成了現代 JavaScript 編程表達的基本范式。

我們需要關注的是,函數本身就是對象,因此函數可以有自身的方法,屬性,并且引用一個原型對象。讓我們來討論下面的代碼的含義。

// 這將返回 true:

typeof (Array) === "function"

// 這樣的表達式也是:

Object.getPrototypeOf(Array) === Object.getPrototypeOf(function () { })

// 這樣的表達式同樣:

Array.prototype != null

代碼中的第一行證明, JavaScript 中的數組是函數。稍后我們將看到如何調用 Array 函數創建一個新的數組對象。下一行代碼,證明了 Array 對象使用與任何其他函數對象相同的原型,就像我們看到數組對象間共享相同的原型一樣。最后一行代碼證明了 Array 函數都有一個 prototype 屬性,而這個 prototype 屬性指向一個有效的對象。這個 prototype 屬性十分重要。

JavaScript 中的每一個函數對象都有 prototype 屬性。千萬不要混淆這個 prototype 屬性的 __proto__ 屬性。他們用途并不相同,也不是指向同一個對象。

// 返回 true

Object.getPrototypeOf(Array) != Array.prototype

Array.__proto__ 提供的是 數組原型 – 請把它當作 Array 函數所繼承的對象。

而 Array.protoype,提供的的是 所有數組的原型對象。也就是說,它提供的是像 myArray 這樣數組對象的原型對象,也包含了所有數組將會繼承的方法。我們可以寫一些代碼來證明這個事實。

// true

Array.prototype == Object.getPrototypeOf(myArray)

// 也是 true

Array.prototype == Object.getPrototypeOf(yourArray);

我們也可以使用這項新知識重繪之前的示意圖。

5

圖 5

基于所知道的知識,請想象創建一個新的對象,并讓新對象表現地像數組的過程。一種方法是使用下面的代碼。

// 創建一個新的空對象

var o = {};

// 繼承自同一個原型,一個數組對象

o.__proto__ = Array.prototype;

// 現在我們可以調用數組的任何方法...

o.push(3);

雖然這段代碼很有趣,也能工作,可問題在于,并不是每一個 JavaScript 環境都支持可寫的 __proto__ 對象屬性。幸運的是,JavaScript 確實有一個創建對象內建的標準機制,只需要一個操作符,就可以創建新對象,并且設置新對象的 __proto__ 引用 – 那就是“new”操作符。

var o = new Array();

o.push(3);

JavaScript 中的 new 操作符有三個基本任務。首先,它創建新的空對象。接下來,它將設置新對象的 __proto__ 屬性,以匹配所調用函數的原型屬性。最后,操作符調用函數,將新對象作為“this”引用傳遞。如果要擴展最后兩行代碼,就會變成如下情況:

var o = {};

o.__proto__ = Array.prototype;

Array.call(o);

o.push(3);

函數的 call 方法允許你在調用函數的情況下在函數內部指定“this”所引用的對象。當然,函數的作者在這種情況下需要實現這樣的函數。一旦作者創建了這樣的函數,就可以將其稱之為構造函數。

構造函數

構造函數和普通的函數一樣,但是具有以下兩個特殊性質。

通常構造函數的首字母是大寫的(讓識別構造函數變得更容易)。

構造函數通常要和 new 操作符結合,用來構造新對象。

Array 就是一個構造函數的例子。Array 函數需要和 new 操作符一起使用,而且 Array 的首字母是大寫的。JavaScript 將 Array 作為內置函數包括在內,而任何人都可以寫出自己的構造函數。事實上,我們最后可以為先前創建的點對象編寫出構造函數。

var Point = function (x, y) {

  this.x = x;

  this.y = y;

  this.add = function (otherPoint) {

    this.x += otherPoint.x;

    this.y += otherPoint.y;

  }

}

var p1 = new Point(3, 4);

var p2 = new Point(8, 6);

p1.add(p2);

在上面的代碼中,我們使用了 new 操作符和 Point 函數來構造點對象,這個對象帶有 x 屬性和 y 屬性和一個 add 方法。你可以將最后的結果想象成圖 6 的樣子。

6

圖 6

現在的問題是我們的每個點對象中仍然有單獨的 add 方法。使用我們學到的原型和繼承的知識,我們更希望將點對象的 add 方法從每個點實例中轉移到 Point.prototype 中。要達到繼承 add 方法的效果,我們所需要做的,就是修改 Point.prototype 對象。

var Point = function (x, y) {

  this.x = x;

  this.y = y;

}

Point.prototype.add = function (otherPoint) {

  this.x += otherPoint.x;

  this.y += otherPoint.y;

}

var p1 = new Point(3, 4);

var p2 = new Point(8, 6);

p1.add(p2);

大功告成!我們剛剛在 JavaScript 中完成原型式的繼承模式!

7

圖 7

總結

我希望這篇文章能夠幫助你揭開 JavaScript 原型概念的神秘面紗。開始看到的是原型怎樣讓一個對象從其他對象中繼承功能,然后看到怎樣結合 new 操作符和構造函數來構建對象。這里所提到的,只是開啟對象原型力量和靈活性的第一步。本文鼓勵你自己發現學習有關原型和 JavaScript 語言的新信息。

同時,請小心駕駛。你永遠不會知道這些行駛在路上的車輛會從他們的原型繼承到什么(有缺陷)的技術。

更多信息請查看IT技術專欄

更多信息請查看網絡編程
易賢網手機網站地址:JavaScript中的原型和繼承詳解(圖文)
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
91久久精品一区二区别| 99国产一区| 国产日韩一区| 久久精品导航| 欧美午夜不卡| 亚洲精品免费观看| 久久福利毛片| 亚洲国产精品www| 久久精品国产第一区二区三区最新章节 | 久久激情视频| 韩日视频一区| 久久精品30| 一本久久综合| 狠狠色丁香久久综合频道| 国产欧美日韩综合一区在线观看| 美女爽到呻吟久久久久| 亚洲精品人人| 国产精品s色| 美女黄色成人网| 亚洲日韩成人| 国产精品二区影院| 欧美一区二区三区另类| 国产视频在线观看一区 | 国产欧美另类| 欧美日韩精品久久| 亚洲女同同性videoxma| 一区二区不卡在线视频 午夜欧美不卡'| 欧美精品三区| 久久综合亚州| 久久性色av| 久久蜜桃精品| 久久午夜精品| 久久婷婷人人澡人人喊人人爽| 国产精品社区| 国产精品久久久久9999高清| 亚洲伦伦在线| 国产日韩1区| 国产日韩综合| 国产精品三上| 免费欧美日韩| 久久一二三四| 欧美日韩视频| 亚洲视频中文| 亚洲人体大胆视频| 亚洲久久视频| 亚洲一区二区三区精品视频| 国产美女诱惑一区二区| 午夜在线a亚洲v天堂网2018| 亚洲欧美日韩视频二区 | 国产尤物精品| 亚洲国产二区| 国产欧美激情| 久久久噜噜噜久久狠狠50岁| 欧美韩国一区| 亚洲无线一线二线三线区别av| 国内精品久久久久久久影视麻豆 | 免费精品视频| 欧美.日韩.国产.一区.二区| 欧美成人首页| 黄色工厂这里只有精品| 亚洲精品日本| 久久九九电影| 国产中文一区| 99在线|亚洲一区二区| 亚洲一区免费看| 欧美精品国产| 中日韩男男gay无套| 亚洲欧美精品在线观看| 欧美精品国产一区| 一本色道久久99精品综合| 午夜亚洲性色视频| 黑人巨大精品欧美一区二区小视频 | 美女亚洲精品| 欧美日韩在线精品| 国产亚洲一级| 国内精品亚洲| 亚洲一区日韩在线| 在线观看成人av| 蜜桃av久久久亚洲精品| 亚洲大胆视频| 久久一区激情| 中文精品视频| 伊人久久综合| 欧美日韩国内| 噜噜噜91成人网| 99精品视频免费全部在线| 欧美精品二区三区四区免费看视频| 亚洲精品国产系列| 欧美日韩 国产精品| 国产精品综合| 亚洲精品裸体| 亚洲一级二级| 欧美精品国产| 久久国产欧美| 性感少妇一区| 亚洲少妇自拍| 亚洲国产精品视频一区| 欧美激情麻豆| 久久久久se| 翔田千里一区二区| 国产欧美综合一区二区三区| 激情综合中文娱乐网| 久久一本综合频道| 久久本道综合色狠狠五月| 国产欧美午夜| 国产日韩欧美一区在线| av不卡在线| 激情丁香综合| 亚洲承认在线| 亚洲美女视频在线免费观看| 亚洲激情黄色| 日韩视频不卡| 国产亚洲欧美另类一区二区三区| 一本色道久久综合亚洲精品不卡| 91久久视频| 日韩午夜免费| 国产精品久久久免费 | 模特精品在线| 免费在线亚洲| 欧美区国产区| 国内外成人免费视频| 国产在线一区二区三区四区| 欧美视频亚洲视频| 在线观看日韩av电影| 激情综合亚洲| 99视频精品| 午夜影院日韩| 国产精品激情| 中文在线不卡| 狂野欧美一区| 亚洲性图久久| 国产精品一区二区三区免费观看| 毛片一区二区| 国产综合网站| 99精品99久久久久久宅男| 国产一区导航| 欧美 日韩 国产一区二区在线视频| 欧美日韩少妇| 亚洲日本欧美| 欧美一区二区三区四区在线观看地址 | 欧美国产91| 狠狠爱成人网| 国产伦精品一区| 欧美喷水视频| 亚洲视频成人| 欧美日韩精品免费观看视一区二区| 国内精品福利| 久久精品首页| 99亚洲精品| 欧美日韩天堂| 羞羞答答国产精品www一本| 欧美日韩精品免费观看| a91a精品视频在线观看| 欧美精品黄色| 西西裸体人体做爰大胆久久久| 欧美激情无毛| 免费一区二区三区| 亚洲精品一品区二品区三品区| 噜噜噜91成人网| 亚洲毛片av| 亚洲无玛一区| 欧美久久在线| 久久精品国产清高在天天线| 亚洲三级影院| 国产精品v欧美精品v日本精品动漫| 国产精品呻吟| 极品中文字幕一区| 老牛国产精品一区的观看方式| 一二三区精品| 亚洲欧洲一区二区天堂久久| 欧美日韩调教| 欧美 日韩 国产在线| 亚洲一区日韩在线| 中文网丁香综合网| 一本色道久久| 一本一道久久综合狠狠老精东影业| 国内精品久久国产| 欧美日韩日本国产亚洲在线| 欧美91精品| 欧美成人69av| 欧美99久久| 午夜激情一区| 欧美精品二区| 欧美涩涩视频| 欧美午夜不卡| 韩国自拍一区| 在线观看一区视频| 亚洲国产一区二区三区a毛片| 黄色成人91| 亚洲第一网站| 亚洲日本黄色| 国产亚洲网站| 久久精品中文| 欧美精品激情| 一区二区视频欧美| 99视频精品免费观看| 亚洲久久一区| 国产日韩一区二区| 国产伦精品一区二区三区视频孕妇| 99国产精品| 香蕉国产精品偷在线观看不卡| 亚洲一区二区伦理| 久久狠狠一本精品综合网| 久久九九精品| 国产一区激情| 国产欧美一区二区三区另类精品 | 久久精品女人| 国产精品红桃| 国产亚洲欧美一区二区| 久久综合中文色婷婷| 国内精品久久久久久久影视麻豆| 亚洲黄色影片| 久久精品天堂| 在线日韩av| 久久久久一区二区三区| 亚洲视屏一区| 99在线观看免费视频精品观看| 亚洲欧美成人综合| 国内精品久久久久久久果冻传媒 | 久久久水蜜桃av免费网站| 欧美韩日精品| 亚洲国产一区二区三区高清 | 狠狠综合久久av一区二区老牛| 一区二区国产精品| 久热国产精品| 亚洲乱码视频| 欧美 亚欧 日韩视频在线| 亚洲理伦在线| 欧美久久一级| 国产日韩在线一区二区三区| 欧美阿v一级看视频| 99精品视频免费观看| 午夜视频一区| 久久大香伊蕉在人线观看热2| 好看的亚洲午夜视频在线| 美女精品网站| 国产日韩亚洲欧美精品| 好吊色欧美一区二区三区四区 | 一区二区冒白浆视频| 欧美激情91| 亚洲综合精品四区| 亚洲麻豆视频| 极品日韩久久| 国产精品yjizz| 久久免费高清| 免费日韩一区二区| 国产精品免费一区二区三区在线观看| 激情久久久久久久| 国产精品国产三级欧美二区| 欧美一区亚洲二区| 久久久久久久高潮| 欧美专区18| 欧美中文字幕| 久久成人资源| 久久激情综合| 国产精品亚洲欧美| 久久精品午夜| 在线午夜精品| 91久久在线| 亚洲日本激情| 99精品国产在热久久婷婷| 韩国av一区| 欧美三日本三级少妇三99| 欧美有码视频| 欧美一区亚洲二区| 久久国产精品亚洲77777| 国产精品一区免费观看| 国产日韩一区二区三区在线| 亚洲三级网站| 99视频+国产日韩欧美| 影音先锋久久| 亚洲啪啪91| 日韩天堂av| 国产精品一区二区三区免费观看| 国产精品裸体一区二区三区| 国产私拍一区| 美女精品网站| 欧美精品首页| 精品动漫3d一区二区三区免费| 激情欧美一区| 国产一区二区你懂的| 新67194成人永久网站| 久久久久久国产精品一区| 欧美激情亚洲| 亚洲视频免费| 国产精品久久久久久久免费软件 | 亚洲国产精品一区制服丝袜| 日韩视频不卡| 久久精品九九| 欧美亚州在线观看| 一本色道久久综合亚洲二区三区| 国产美女诱惑一区二区| 欧美淫片网站| 亚洲美女一区| 可以免费看不卡的av网站| 狠狠色噜噜狠狠狠狠色吗综合| aa国产精品| 欧美精品一区二区三区在线看午夜 | 欧美精品日本| 亚洲欧洲在线一区| 美女精品在线观看| 欧美三级在线| 亚洲欧美日韩精品久久久| 欧美精品成人| 国产精品一区二区a| 欧美三区视频| 午夜一级久久| 亚洲第一在线| 欧美黄色大片网站| 999在线观看精品免费不卡网站| 久久精选视频| 国产欧美韩日| 国产一区清纯| 久久福利电影| 99国产精品久久久久老师| 欧美日韩国产探花| 久久精品一区| 亚洲欧美日韩综合国产aⅴ| 亚洲国产欧美国产综合一区| 午夜日韩激情| 久久亚洲午夜电影| 国产精品一卡| 9国产精品视频| 亚洲国产日本| 韩国久久久久| 欧美在线看片| 久久精品国产第一区二区三区最新章节 | 亚洲综合欧美日韩| 亚洲欧洲在线一区| 狠狠综合久久| 欧美视频官网| 午夜久久福利| 久久久精品动漫| 亚洲欧美日韩在线综合| 99国产精品私拍| 亚洲黄色精品| 亚洲国产一区二区三区在线播| 欧美午夜a级限制福利片| 久久久久久一区二区| 国产精品一二| 国产精品亚洲综合| 中文欧美日韩| 一本色道婷婷久久欧美| 日韩一级在线| 国产亚洲亚洲| 亚洲欧美日韩视频二区| 午夜亚洲伦理| 久久国产精品99国产| 国产精品一区二区三区观看| 一本色道久久综合亚洲精品高清| 亚洲人体一区| 99成人精品| 亚洲一区网站| 久久久久久久波多野高潮日日| 久久电影一区| 欧美不卡一区| 欧美先锋影音| 亚洲无线视频| 一区二区三区久久网| 国产一区二区精品| 翔田千里一区二区| 久久在线精品| 欧美日韩影院| 亚洲高清久久| 国产精品社区| 欧美日韩国产亚洲一区| 在线成人av| 蜜桃av综合| 国外成人免费视频| 日韩亚洲不卡在线| 老司机精品久久| 伊人成人在线| 久久福利一区| 激情欧美一区二区三区| 中国女人久久久| 午夜精品免费| aa级大片欧美三级| 久久久综合香蕉尹人综合网| 国内精品嫩模av私拍在线观看| 亚洲第一精品影视| 久久人人97超碰国产公开结果| 亚洲天堂激情| 久久久精品性| 亚洲精品黄色| 欧美久久一区| 国产精品手机在线| 韩国自拍一区| 久久婷婷麻豆| 中国成人亚色综合网站| 欧美日韩在线高清| 中文精品视频| 激情一区二区三区| 欧美在线播放一区| 国产精品日韩二区| 伊人影院久久| 欧美日韩精品| 老色鬼久久亚洲一区二区| 日韩亚洲欧美精品| 狠狠色综合色区| 欧美精品亚洲|