首頁 web前端 js教程 JavaScript prototype 使用介紹_javascript技巧

JavaScript prototype 使用介紹_javascript技巧

May 16, 2016 pm 05:24 PM
javascript

用過JavaScript的同學們肯定都對prototype如雷貫耳,但是這究竟是個什麼東西卻讓初學者莫衷一是,只知道函數都會有一個prototype屬性,可以為其添加函數供實例訪問,其它的就不清楚了,最近看了一些JavaScript高階程式設計,終於揭開了其神秘面紗。

每個函數都有一個prototype屬性,這個屬性是指向一個對象的引用,這個對象稱為原型對象,原型對象包含函數實例共享的方法和屬性,也就是說將函數用作構造函數呼叫(使用new操作符呼叫)的時候,新建立的物件會從原型物件上繼承屬性和方法。

私有變數、函數

在具體說prototype前說幾個相關的東東,可以更好的理解prototype的設計意圖。之前寫的一篇JavaScript 命名空間文章中提到過JavaScript的函數作用域,在函數內定義的變數和函數如果不對外提供接口,那麼外部將無法訪問到,也就是變為私有變數和私有函數。

複製碼 代碼如下:

f ; //私人變數
                 }



這樣在函數物件Obj外部無法存取變數a和函數fn,它們就變成私有的,只能在Obj內部使用,即使是函數Obj的實例仍然無法存取這些變數和函數

複製程式碼

程式碼如下:var oolecH();
var oole H();


var oole H();
            console.log(o.fn); //undefined

靜態變數、函數

當定義一個函數後透過「.」為其添加的屬性和函數,透過物件本身仍然可以存取得到,但是其實例卻訪問不到,這樣的變數和函數分別被稱為靜態變數和靜態函數,用過Java、C#的同學很好理解靜態的意思。 複製程式碼

程式碼如下:




            Obj.a=0; //靜態變數

            }

            console.log (Obj.a); //0
            console.log(typeof Obj.fn); //function

        console.log(o.a); / /undefined
            console.log(typeof o.fn); //undefined


實例變數、函數

在物件導向程式設計中除了一些函式庫函數我們還是希望在物件定義的時候同時定義一些屬性和方法,實例化後可以訪問,JavaScript也能做到這樣

複製程式碼 程式碼如下:

function Obj(){
                this.a=[]; //實例變數
                }
}

            console.log(typeof Obj.a); //undefined
              var o=new Obj();
            console.log(typeof o.a); //object
            console.log(typeo.fn.fn);
這樣可以達到上述目的,然而



複製碼

代碼如下:

            var o1=new Obj();
o1.a.push(1);
            o1.fn={};
           log(typeof o1.fn); / /object
            var o2=new Obj();
           o2.fn); //function



上面的程式碼運行結果完全符合預期,但同時也說明一個問題,在o1中修改了a和fn,而在o2中沒有改變,由於數組和函數都是對象,是引用類型,這就說明o1中的屬性和方法與o2中的屬性與方法雖然同名但卻不是一個引用,而是對Obj物件定義的屬性和方法的複製。

這個對屬性來說沒有什麼問題,但是對於方法來說問題就很大了,因為方法都是在做完全一樣的功能,但是卻又兩份複製,如果一個函數物件有上千和實例方法,那麼它的每個實例都要保持一份上千個方法的複製,這顯然是不科學的,這可腫麼辦呢,prototype應運而生。


prototype


無論什麼時候,只要建立了一個新函數,就會根據一組特定的規則為該函數建立一個prototype屬性,預設情況下prototype屬性會預設得到一個constructor(建構子)屬性,這個屬性是一個指向prototype屬性所在函數的指針,有些繞了啊,寫程式、上圖!

複製程式碼

程式碼如下:

根據上圖可以看出Person對象會自動取得prototyp屬性,而prototype也是一個對象,會自動獲得一個constructor屬性,該屬性正是指向Person對象。

當呼叫建構函式建立一個實例的時候,實例內部會包含一個內部指標(很多瀏覽器這個指標名字為__proto__)指向建構函式的prototype,這個連線存在於實例和建構函式的prototype之間,而不是實例與建構函數之間。




複製程式碼

image 程式碼如下:


function Person(name){
                this.name=name;
      Person.prototype.printName=function(){
                alert(this.name) ;
            }

            var person1=new Personࠎ ;



Person的實例person1包含了name屬性,同時自動產生一個__proto__屬性,該屬性指向Person的prototype,可以存取到prototype內定義的printName方法,大概就是這個樣子的image

寫段程式測試一下看看prototype內屬性、方法是能夠共享image

複製碼 代碼如下:f =name;
            }

             function(){
                alert(this.name);
            }

            var person1=new Person('Byron);  >
            person1.share.push(1);
            person2.share.push(2);
            console.log(person2.share); //[1,2]



果不其然!實際上當程式碼讀取某個物件的某個屬性的時候,都會執行一遍搜索,目標是具有給定名字的屬性,搜索首先從物件實例開始,如果在實例中找到該屬性則​​返回,如果沒有則查找prototype,如果還是沒有找到則繼續遞歸prototype的prototype對象,直到找到為止,如果遞歸到object仍然沒有則返回錯誤。同樣道理如果在實例中定義如prototype同名的屬性或函數,則會覆寫prototype的屬性或函數。




複製碼

代碼如下:

f =name;            }            Person.prototype.share=[];             var person=new Person('Byron');
           share); //0而不是prototype中的[]



建構簡單物件

當然prototype不是專門為解決上面問題而定義的,但是卻解決了上面問題。了解了這些知識就可以建構一個科學些的、復用率高的對象,如果希望實例對象的屬性或函數則定義到prototype中,如果希望每個實例單獨擁有的屬性或方法則定義到this中,可以透過建構函數傳遞實例化參數。





複製程式碼

程式碼如下:


関数 person(name){
this.name=name;
}

person.prototype.share=[];

人物.プロトタイプ。 printName=function(){
alert(this.name);
}

作者:色拉油

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

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

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

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

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

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

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

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

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

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

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

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

See all articles