這次帶給大家怎樣對JS原型與原型鏈進行使用,對JS原型與原型鏈進行使用的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。
我們創(chuàng)建的每個函數(shù)都有一個 prototype (原型)屬性,這個屬性是一個指針,指向一個原型對象,而這個原型對像中擁有的屬性和方法可以被所以實例共享。
function?Person(){ } Person.prototype.name?=?"Nicholas"; Person.prototype.age?=?29; Person.prototype.sayName?=?function(){ alert(this.name); }; var?person1?=?new?Person(); person1.sayName();?//"Nicholas" var?person2?=?new?Person(); person2.sayName();?//"Nicholas" alert(person1.sayName?==?person2.sayName);?//true
一、理解原型物件
無論什麼時候,只要建立了一個新函數(shù),就會根據(jù)一組特定的規(guī)則為該函數(shù)建立一個prototype屬性,這個屬性指向函數(shù)的原型物件。
在預(yù)設(shè)情況下,所有原型物件都會自動取得一個 constructor(建構(gòu)子)屬性,這個屬性包含一個指向 prototype 屬性所在函數(shù)的指標。
當(dāng)呼叫建構(gòu)函式建立一個新實例後,該實例的內(nèi)部將包含一個指標(內(nèi)部屬性),指向建構(gòu)函式的原型物件。 ECMA-262 第 5 版中管這個指標叫 [[Prototype]] 。
雖然在腳本中沒有標準的方式存取[[Prototype]] ,但Firefox、Safari 和Chrome 在每個物件上都支援一個屬性__proto__ ;而在其他實作中,這個屬性對腳本則是完全不可見的。
不過,要明確的真正重要的一點就是,這個連結(jié)存在於實例與建構(gòu)子的原型物件之間,而不是存在於實例與建構(gòu)子之間。
以前面使用 Person 建構(gòu)子和 Person.prototype 建立實例的程式碼為例,圖 6-1 展示了各個物件之間的關(guān)係。
在此,Person.prototype 指向了原型對象,而 Person.prototype.constructor 又指回了 Person 。
person1 和 person2 都包含一個內(nèi)部屬性,該屬性僅僅指向了 Person.prototype ;換句話說,它們與建構(gòu)函數(shù)沒有直接的關(guān)係。
可以呼叫 person1.sayName() 。這是透過尋找物件屬性的過程來實現(xiàn)的。 (會先在實例上搜索,如果搜索不到就會繼續(xù)搜索原型。)
用isPrototypeOf()方法判斷實例與原型對象之間的關(guān)系 alert(Person.prototype.isPrototypeOf(person1));?//true alert(Person.prototype.isPrototypeOf(person2));?//true 用Object.getPrototypeOf()?方法返回實例的原型對象 alert(Object.getPrototypeOf(person1)?==?Person.prototype);?//true 使用?hasOwnProperty()?方法可以檢測一個屬性是存在于實例中,還是存在于原型中。 alert(person1.hasOwnProperty("name"));?//false 來著原型 person1.name?=?"Greg"; alert(person1.name);?//"Greg"——來自實例 alert(person1.hasOwnProperty("name"));?//true
二、更簡單的原型語法
前面例子每添加一個屬性和方法就要敲一遍Person.prototype 。為減少不必要的輸入,也為了從視覺上更好地封裝原型的功能,更常見的做法是用一個包含所有屬性和方法的物件字面量來重寫整個原型物件。
function?Person(){ } Person.prototype?=?{ name?:?"Nicholas", age?:?29, job:?"Software?Engineer", sayName?:?function?()?{ alert(this.name); } };
在上面的程式碼中,我們將 Person.prototype 設(shè)定為等於一個以物件字面量形式建立的新物件。最終結(jié)果相同,但有一個例外: constructor 屬性不再指向 Person 了。
前面曾經(jīng)介紹過,每建立一個函數(shù),就會同時建立它的 prototype 對象,這個物件也會自動獲得 constructor 屬性。
var?friend?=?new?Person(); alert(friend?instanceof?Object);?//true alert(friend?instanceof?Person);?//true alert(friend.constructor?==?Person);?//false alert(friend.constructor?==?Object);?//true
在此,用 instanceof 運算子測試 Object 和 Person 仍然傳回 true ,但 constructor 屬性則等於 Object 而不等於 Person 了。
如果 constructor 的值真的很重要,可以像下面這樣特意將它設(shè)定回適當(dāng)?shù)闹怠?
function?Person(){ } Person.prototype?=?{ ??constructor?:?Person, ??name?:?"Nicholas", ??age?:?29, ??job:?"Software?Engineer", ??sayName?:?function?()?{ ????alert(this.name); ??} };
三、原生物件的原型
所有原生參考類型( Object 、 Array 、 String ,等等)都在其建構(gòu)子的原型上定義了方法。
例如,在 Array.prototype 中可以找到 sort() 方法,而在 String.prototype 中可以找到substring() 方法。儘管可以這樣做,但不建議修改原生物件的原型。
四、原型物件的問題
原型模式的最大問題是由其共享的本質(zhì)所導(dǎo)致的。修改其中的一個,另一個也會受影響。
function?Person(){ } Person.prototype?=?{ constructor:?Person, name?:?"Nicholas", age?:?29, job?:?"Software?Engineer", friends?:?["Shelby",?"Court"], sayName?:?function?()?{ alert(this.name); } }; var?person1?=?new?Person(); var?person2?=?new?Person(); person1.friends.push("Van"); alert(person1.friends);?//"Shelby,Court,Van" alert(person2.friends);?//"Shelby,Court,Van" alert(person1.friends?===?person2.friends);?//true
五、原型鏈
其基本思想是利用原型讓一個引用型別繼承另一個引用型別的屬性和方法。然後層層遞進,就構(gòu)成了實例與原型的鏈條,這就是所謂原型鏈的基本概念。
function?SuperType(){ this.property?=?true; } SuperType.prototype.getSuperValue?=?function(){ return?this.property; }; function?SubType(){ this.subproperty?=?false; } //繼承了?SuperType SubType.prototype?=?new?SuperType(); SubType.prototype.getSubValue?=?function?(){ return?this.subproperty; }; var?instance?=?new?SubType(); alert(instance.getSuperValue());?//true
一張圖說明:
property 則位於 SubType.prototype 中。這是因為 property 是實例屬性,而 getSuperValue() 則是原型方法。既然 SubType.prototype 現(xiàn)在是 SuperType的實例,那麼 property 當(dāng)然就位於該實例中了。
相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注php中文網(wǎng)其它相關(guān)文章!
推薦閱讀:
#react native video做出全螢?zāi)恍Ч?/a>
以上是怎樣對JS原型與原型鏈進行使用的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

WebSocket與JavaScript:實現(xiàn)即時監(jiān)控系統(tǒng)的關(guān)鍵技術(shù)引言:隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,即時監(jiān)控系統(tǒng)在各個領(lǐng)域中得到了廣泛的應(yīng)用。而實現(xiàn)即時監(jiān)控的關(guān)鍵技術(shù)之一就是WebSocket與JavaScript的結(jié)合使用。本文將介紹WebSocket與JavaScript在即時監(jiān)控系統(tǒng)中的應(yīng)用,並給出程式碼範(fàn)例,詳細解釋其實作原理。一、WebSocket技

如何使用WebSocket和JavaScript實現(xiàn)線上語音辨識系統(tǒng)引言:隨著科技的不斷發(fā)展,語音辨識技術(shù)已成為了人工智慧領(lǐng)域的重要組成部分。而基於WebSocket和JavaScript實現(xiàn)的線上語音辨識系統(tǒng),具備了低延遲、即時性和跨平臺的特點,成為了廣泛應(yīng)用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現(xiàn)線上語音辨識系

如何利用JavaScript和WebSocket實現(xiàn)即時線上點餐系統(tǒng)介紹:隨著網(wǎng)路的普及和技術(shù)的進步,越來越多的餐廳開始提供線上點餐服務(wù)。為了實現(xiàn)即時線上點餐系統(tǒng),我們可以利用JavaScript和WebSocket技術(shù)。 WebSocket是一種基於TCP協(xié)定的全雙工通訊協(xié)議,可實現(xiàn)客戶端與伺服器的即時雙向通訊。在即時線上點餐系統(tǒng)中,當(dāng)使用者選擇菜餚並下訂單

JavaScript和WebSocket:打造高效的即時天氣預(yù)報系統(tǒng)引言:如今,天氣預(yù)報的準確性對於日常生活以及決策制定具有重要意義。隨著技術(shù)的發(fā)展,我們可以透過即時獲取天氣數(shù)據(jù)來提供更準確可靠的天氣預(yù)報。在本文中,我們將學(xué)習(xí)如何使用JavaScript和WebSocket技術(shù),來建立一個高效的即時天氣預(yù)報系統(tǒng)。本文將透過具體的程式碼範(fàn)例來展示實現(xiàn)的過程。 We

如何使用WebSocket和JavaScript實現(xiàn)線上預(yù)約系統(tǒng)在當(dāng)今數(shù)位化的時代,越來越多的業(yè)務(wù)和服務(wù)都需要提供線上預(yù)約功能。而實現(xiàn)一個高效、即時的線上預(yù)約系統(tǒng)是至關(guān)重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預(yù)約系統(tǒng),並提供具體的程式碼範(fàn)例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript教學(xué):如何取得HTTP狀態(tài)碼,需要具體程式碼範(fàn)例前言:在Web開發(fā)中,經(jīng)常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經(jīng)常需要取得傳回的HTTP狀態(tài)碼來判斷操作是否成功,並根據(jù)不同的狀態(tài)碼來進行對應(yīng)的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態(tài)碼,並提供一些實用的程式碼範(fàn)例。使用XMLHttpRequest

JavaScript中的HTTP狀態(tài)碼取得方法簡介:在進行前端開發(fā)中,我們常常需要處理與後端介面的交互,而HTTP狀態(tài)碼就是其中非常重要的一部分。了解並取得HTTP狀態(tài)碼有助於我們更好地處理介面?zhèn)骰氐馁Y料。本文將介紹使用JavaScript取得HTTP狀態(tài)碼的方法,並提供具體程式碼範(fàn)例。一、什麼是HTTP狀態(tài)碼HTTP狀態(tài)碼是指當(dāng)瀏覽器向伺服器發(fā)起請求時,服務(wù)

JavaScript是一種廣泛應(yīng)用於Web開發(fā)的程式語言,而WebSocket則是一種用於即時通訊的網(wǎng)路協(xié)定。結(jié)合二者的強大功能,我們可以打造一個高效率的即時影像處理系統(tǒng)。本文將介紹如何利用JavaScript和WebSocket來實作這個系統(tǒng),並提供具體的程式碼範(fàn)例。首先,我們需要明確指出即時影像處理系統(tǒng)的需求和目標。假設(shè)我們有一個攝影機設(shè)備,可以擷取即時的影像數(shù)
