亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 常見問題 js原型和原型鍊是什麼

js原型和原型鍊是什麼

Jun 14, 2023 am 11:34 AM
javascript 原型鏈

js原型和原型鍊是:1、原型,所有的函數(shù)預(yù)設(shè)都有一個「prototype」這樣公有且不可列舉的屬性,它會指向另一個對象,這個物件就是原型。 2.原型鏈,當(dāng)存取物件的屬性或方法時,首先物件會從自身去找,找不到就會往原型中去找,也就是它建構(gòu)函式的「prototype」中,如果原型中找不到,即建構(gòu)函式中也沒有該屬性,就會往原型後面的原型上去找,這樣就形成了鍊式的結(jié)構(gòu),稱為原型鏈。

js原型和原型鍊是什麼

本教學(xué)作業(yè)系統(tǒng):windows10系統(tǒng)、JavaScript? ECMAScript 2021版本、DELL G3電腦。

一、原型

原型:所有的函數(shù)預(yù)設(shè)都有一個「prototype」這樣公有且不可列舉的屬性,它會指向另一個對象,這個對象就是原型。每當(dāng)定義一個物件(函數(shù)也是物件)時,就會產(chǎn)生一個__proto__屬性,被稱為隱式原型;這個__proto__屬性指向的是這個物件的建構(gòu)函數(shù)的prototype,被稱為顯式原型。每一個物件都會從原型中「繼承」屬性。

首先看一個例子,建立一個Student類,並建立類別的實例物件student:

class Student{
    constructor(name, score) {
        this.name = name;
        this.score = score;
    }
    introduce() {
        console.log(`我是${this.name},考了${this.score}分。`)
    }
}
const student = new Student('張三', 99)
console.log('student', student); // student Student { name: '張三', score: 99}
student.introduce(); // 我是張三,考了99分。

控制臺能存取到屬性和方法。

js原型和原型鍊是什麼

但直接在控制臺輸入student,會發(fā)現(xiàn)只有name和score屬性,沒有introduce方法,但有一個[[Prototype]]屬性,用兩個中括號括起來。

js原型和原型鍊是什麼

把[[Prototype]]展開,會發(fā)現(xiàn)introduce方法在[[Prototype]]中。

js原型和原型鍊是什麼

[[Prototype]]屬性被稱為student物件的隱式原型。當(dāng)我們要去找一個物件的屬性或方法時,如果在目前物件上找不到,就會去當(dāng)前物件的隱式原型[[Prototype]]屬性上去找。

可透過.__proto__屬性存取原型,注意__proto__兩邊分別有兩條底線。

js原型和原型鍊是什麼

而Student()建構(gòu)子也有一個prototype屬性,Student()建構(gòu)子的prototype屬性其實等於student物件的__proto__屬性。

1.js原型和原型鍊是什麼

下面用一張圖來說明:

js原型和原型鍊是什麼

#因此,建構(gòu)子的prototype屬性就等於實例物件的__proto__屬性,建構(gòu)函數(shù)的prototype屬性稱為明確原型,實例物件的__proto__屬性稱為隱式原型。

二、原型鏈

原型鏈:當(dāng)存取一個物件的屬性或方法時,首先物件會從自身去找,如果找不到,就會往原型中去找,即__proto__,也就是它構(gòu)造函數(shù)的prototype中;如果原型中找不到,即構(gòu)造函數(shù)中也沒有該屬性,因為構(gòu)造函數(shù)也是對象,也有__proto__,就會往原型上去找,這樣就形成了鍊式的結(jié)構(gòu),稱為原型鏈,本質(zhì)描述的是物件的一種繼承關(guān)係。

再來看一個例子,建立一個Person類,再建立一個Teacher類別繼承自Person類,並建立實例物件teacher:

class Person {
    constructor(name) {
        this.name = name;
    }
    drink(){
        console.log('喝水');
    }
}
class Teacher extends Person {
    constructor(name, subject) {
        super(name);
        this.subject = subject;
    }
    teach() {
        console.log(`我是${this.name}, 教${this.subject}。`)
    }
}
const teacher = new Teacher('哈默', '前端開發(fā)')
console.log('teacher', teacher);
teacher.teach();
teacher.drink();

控制臺輸出如下,teacher可以執(zhí)行teach()和drink()方法。

js原型和原型鍊是什麼

展開teacher對象,發(fā)現(xiàn)找不到這兩個方法,於是去找對象的原型,即__proto__屬性,找到teach()方法,再展開下一層__proto__屬性,找到drink()方法。

js原型和原型鍊是什麼

下面用一張圖說明:

js原型和原型鍊是什麼

#

可以看到,teacher實例對象本身是沒有teach()方法的,這時就會去teacher對象的__proto__隱式原型指向的Teacher.prototype顯式原型上去找,此時找到了teach()方法并執(zhí)行;同時,Teacher.prototype上仍然沒有找到drink()方法,而Teacher.prototype也是一個對象,有自己的__proto__隱式原型,那么就去Teacher.prototype.__proto__上去找,Teacher.prototype.__proto__會指向Person()構(gòu)造函數(shù)的顯式原型Person.prototype,此時找到了drink()方法并執(zhí)行,這就是原型鏈。

注:

(1)通過__proto__形成原型鏈而非protrotype。

(2)__proto__屬性是對象所獨(dú)有的。

(3)prototype屬性是函數(shù)所獨(dú)有的。但是由于JS中函數(shù)也是一種對象,所以函數(shù)也擁有__proto__屬性。

三、判斷對象自身是否有某屬性或方法

hasOwnProperty()方法會返回一個布爾值,用于判斷對象自身是否有某屬性或方法。返回true,代表是該對象自身的屬性或方法;返回false,代表是該對象原型上的屬性或方法。

由于Person類繼承自O(shè)bject類,那么執(zhí)行teacher.hasOwnProperty()方法時,實際會找到Object.prototype中的hasOwnProperty()方法并執(zhí)行。

因此,所有繼承了Object的對象都會繼承到hasOwnProperty方法。

同時可以看到,Object.prototype.__proto__ 的值為 null ,即 Object.prototype 沒有原型,所以可以想象在原型鏈中,當(dāng)找到頂層原型還沒有屬性時,那就是沒有這個屬性,返回返回undefined。

js原型和原型鍊是什麼

instanceof 運(yùn)算符:用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個實例對象的原型鏈上。

看一個例子,使用typeof判斷array的數(shù)據(jù)類型時,返回的是object,因此無法使用typeof判斷array的類型。

const object = {};
const array = [];
// 使用typeof判斷數(shù)據(jù)類型,array返回的是object 
console.log(typeof object); // object
console.log(typeof array); // object

下面使用instanceof運(yùn)算符判斷array的數(shù)據(jù)類型:

// 使用instanceof判斷數(shù)據(jù)類型
const flagObject = object instanceof Array;
const flagArray = array instanceof Array;
console.log(flagObject); // false
console.log(flagArray); // true

object instanceof Array返回false,表示Array.prototype不在object的原型鏈上;array instanceof Array返回true,表示Array.prototype在array的原型鏈上,由此可以區(qū)分object和array的數(shù)據(jù)類型。

也可通過控制臺查看object和array的原型。

注:[] instanceof Object 為 true

以上是js原型和原型鍊是什麼的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

WebSocket與JavaScript:實現(xiàn)即時監(jiān)控系統(tǒng)的關(guān)鍵技術(shù) WebSocket與JavaScript:實現(xiàn)即時監(jiān)控系統(tǒng)的關(guān)鍵技術(shù) Dec 17, 2023 pm 05:30 PM

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)例,詳細(xì)解釋其實作原理。一、WebSocket技

如何使用WebSocket和JavaScript實現(xiàn)線上語音辨識系統(tǒng) 如何使用WebSocket和JavaScript實現(xiàn)線上語音辨識系統(tǒng) Dec 17, 2023 pm 02:54 PM

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

JavaScript與WebSocket:打造高效率的即時天氣預(yù)報系統(tǒng) JavaScript與WebSocket:打造高效率的即時天氣預(yù)報系統(tǒng) Dec 17, 2023 pm 05:13 PM

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

簡易JavaScript教學(xué):取得HTTP狀態(tài)碼的方法 簡易JavaScript教學(xué):取得HTTP狀態(tài)碼的方法 Jan 05, 2024 pm 06:08 PM

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

如何在JavaScript中取得HTTP狀態(tài)碼的簡單方法 如何在JavaScript中取得HTTP狀態(tài)碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態(tài)碼取得方法簡介:在進(jìn)行前端開發(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和WebSocket:打造高效能的即時資料視覺化 JavaScript和WebSocket:打造高效能的即時資料視覺化 Dec 17, 2023 pm 04:38 PM

JavaScript和WebSocket:打造高效能的即時資料視覺化隨著網(wǎng)路的快速發(fā)展,即時資料視覺化對於許多領(lǐng)域都變得越來越重要。無論是金融交易、物流運(yùn)輸,或是工業(yè)監(jiān)控等領(lǐng)域,即時數(shù)據(jù)的視覺化都可以幫助我們更好地理解和分析數(shù)據(jù),從而做出更明智的決策。在網(wǎng)路開發(fā)中,JavaScript和WebSocket技術(shù)結(jié)合起來,可以實現(xiàn)高效能的即時資料視覺化。 W

JavaScript和WebSocket:打造高效率的即時搜尋引擎 JavaScript和WebSocket:打造高效率的即時搜尋引擎 Dec 17, 2023 pm 10:13 PM

JavaScript和WebSocket:打造高效率的即時搜尋引擎引言:隨著網(wǎng)路的發(fā)展,使用者對即時搜尋引擎的要求也越來越高。傳統(tǒng)的搜尋引擎在進(jìn)行搜尋時,使用者需要點(diǎn)擊搜尋按鈕後才能得到結(jié)果,這種方式無法滿足使用者對於即時搜尋結(jié)果的需求。因此,採用JavaScript和WebSocket技術(shù)來實現(xiàn)即時搜尋引擎成為了一個熱門的話題。本文將詳細(xì)介紹使用JavaScri

如何使用WebSocket和JavaScript實現(xiàn)線上電子簽名系統(tǒng) 如何使用WebSocket和JavaScript實現(xiàn)線上電子簽名系統(tǒng) Dec 18, 2023 pm 03:09 PM

如何使用WebSocket和JavaScript實現(xiàn)線上電子簽名系統(tǒng)概述:隨著數(shù)位化時代的到來,電子簽名被廣泛應(yīng)用於各個產(chǎn)業(yè)中,以取代傳統(tǒng)的紙本簽名。 WebSocket作為全雙工通訊協(xié)議,可以與伺服器進(jìn)行即時的雙向資料傳輸,結(jié)合JavaScript可以實現(xiàn)一個線上電子簽名系統(tǒng)。本文將介紹如何使用WebSocket和JavaScript來開發(fā)一個簡單的在線