JS基礎之原型原型鏈

JS基礎之原型&原型鏈

  • 原型&原型鏈
    • 構造函數創建對象
    • prototype
    • proto
    • constructor
    • 實例與原型
    • 原型的原型
    • 原型鏈
    • 其他
      • constructor
      • proto
      • 繼承

原型&原型鏈

構造函數創建對象

我們先使用構造函數創建一個對象:

function Person(){
}
var person = new Person();
person.name = 'trigger';
console.log(person.name);//trigger

在這個例子中,Person就是一個構造函數,我們使用new創建了一個實例對象person。

prototype

每個函數都有一個prototype屬性,比如:

function Person(){}
//雖然寫在注釋里,但是你要注意:
//prototype是函數才會有的屬性
Person.prototype.name = 'pig';
var person1 = new Person();
var person2 = new Person();console.log(person1.name);//pig
console.log(person2.name);//pig

那這個函數的prototype屬性到底指向的是什么呢?是這個函數的原型嗎?
其實,函數的prototype屬性指向了一個對象,這個對象正是調用該構造函數而穿件的實例的原型,也就是這個例子中的person1person2的原型。
那什么是原型呢?你可以這樣理解:
每一個JavaScript對象(null除外)在創建的時候就會與之關聯另一個對象,這個對象就是我們所說的原型,每一個對象都會從原型“繼承”屬性。
用一張圖表示構造函數和實例原型之間的關系:

在這里插入圖片描述這里用Person.prototype表示實例原型。
那么該怎么表示實例與實例原型,也就是personPerson.prototype之間的關系呢?

proto

這是每一個JavaScript對象(除了null)都具有的一個屬性,叫__proto__,這個屬性會指向該對象的原型。

function Person(){}
var person = new Person();
console.log(person.__proto__ === Person.prototype);//true

在這里插入圖片描述

既然實例對象和構造函數都可以指向原型,那么原型是否有屬性指向構造函數或者實例呢?

constructor

指向實例倒是沒有,因為一個構造函數可以生成多個實例,但是原型指向構造函數是有的:constuctor,每個原型都有一個constructor屬性指向關聯的構造函數。

function Person(){}
console.log(Person === Person.prototype.constructor);//true

在這里插入圖片描述所以,這里可以得到:

function Person(){}
var person = new Person();
console.log(person.__proto__ == Person.prototype);//true
console.log(Person.prototype.constructor == Person);//true
console.log(Object.getPrototypeOf(person) === Person.prototype);// true

實例與原型

當讀取實例的屬性時,如果找不到,就會查找與對象關聯的原型中的屬性,如果還查不到,就去找原型的原型,一直找到最頂層為止。
舉個例子:

function Person(){
}
Person.prototype.name = 'cat';
var person = new Person();
person.name = 'dog';
console.log(person.name);//dog
delete person.name;
console.log(person.name);//cat

在這個例子中,我們給實例對象person添加了name屬性,當我們打印person.name的時候,結果自然為dog
但是當我們刪除person中的name屬性時,讀取person.name,從person對象中找不到name屬性就會從person的原型,也就是person.__proto__,也就是Person.prototype中查找,結果為cat

原型的原型

如果在原型撒花姑娘還沒有找到呢?原型的原型又是什么呢?

var obj = new Object();
obj.name = 'rabbit';
console.log(obj.name);//rabbit

其實原型對象就是通過Object構造函數生成的,結合之前所說,實例的__proto__指向構造函數的prototype,所以我們再更新下關系圖:
在這里插入圖片描述

原型鏈

Object.prototype的原型呢?
null,我們可以打印:

console.log(Object.prototype.__proto__ === null);//true

然而null究竟代表了什么呢?
null表示“沒有對象”,即該處不應該有值。
所以Object.prototype.__proto__的值為null跟Object.prototype沒有原型,其實表達了一個意思。
所以查找屬性的時候查到Object.prototype就可以停止查找了。
最后一張關系圖也可以更新為:
在這里插入圖片描述其中,藍色為原型鏈。

其他

constructor

首先是constructor屬性:

function Person(){
}
var person = new Person();
console.log(person.constructor === Person);//true

當獲取person.constructor時,其實person中并沒有constructor屬性,當不能讀取到constructor屬性時,會從person的原型也就是Person.prototype中讀取,正好原型中有該屬性,所以:

person.constructor === Person.prototype.constructor

proto

絕大部分瀏覽器都支持這個非標準的方法訪問原型,然而它并不存在與Person.prototype中,實際上,他是來自于Object.prototype,與其說是一個屬性,不如說是一個getter/setter,當使用obj.__proto__時,可以理解成返回了Object.getPrototypeOf(obj)

繼承

關于繼承,前面提到“每一個對象都會從原型‘繼承’屬性”,實際上,繼承是一個十分具有迷惑性的說法,引用《你不知道的JavaScript》中的話,就是:

繼承意味著復制操作,然而JavaScript默認并不會復制對象的屬性,相反,JavaScript只是在兩個對象之間創建一個關聯,這樣,一個對象就可以通過委托訪問另一個對象的屬性和函數,所以與其叫繼承,委托的說法反而更準確些。

好啦~枯燥的知識就到這里啦!
欣賞一下美女壁紙,放松一下心情吧~ 嘻嘻 ~

在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211643.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211643.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211643.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多窗口文件管理工具Q-Dir安裝以及使用教程

軟件介紹 Q-Dir 是一款功能強大的Windows資源管理器,可以非常方便的管理你的各種文件。Q-Dir有4 個窗口,特別適用于頻繁在各個目錄間跳躍復制粘貼的情況,每個窗口都可以方便的切換目錄,以不同顏色區分不同類型的文件,…

(企業項目)微服務項目解決跨域問題:

前后端分離項目中前端出現了跨域的問題 在網關模塊配置文件中添加 配置 application.properties # 允許請求來源(老版本叫allowedOrigin) spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOriginPatterns* # 允許攜帶的頭信息 spri…

idea__SpringBoot微服務06——靜態資源(新依賴),首頁和圖標定制

靜態資源 一、靜態資源二、首頁和圖標定制————————創作不易&#xff0c;如覺不錯&#xff0c;隨手點贊&#xff0c;關注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;謝謝~~ 新依賴&#xff1a;jquery的 <dependency><groupId>org.webjars&…

說說設計體系、風格指南和模式庫

目錄 一、定義 二、設計體系 2.1 Design system 2.2 風格指南 2.3 Component 三、樣式庫 一、定義 設計體系&#xff08;Design system&#xff09;&#xff1a;可共享的設計語言的基礎合集&#xff0c;包含了設計價值&#xff0c;語義&#xff0c;語法和上下文。 風格…

matplotlib 默認屬性和繪圖風格

matplotlib 默認屬性 一、繪圖風格1. 繪制疊加折線圖2. Solarize_Light23. _classic_test_patch4. _mpl-gallery5. _mpl-gallery-nogrid6. bmh7. classic8. fivethirtyeight9. ggplot10. grayscale11. seaborn12. seaborn-bright13. seaborn-colorblind14. seaborn-dark15. sea…

Chart 7 內存優化

文章目錄 前言7.1 Adreno GPU OpenCL內存7.1.1 內存聲明周期7.1.2 Loacl Memory7.1.3 Constant memory(常量內存)7.1.4 Private Memory7.1.5 Global Memory7.1.5.1 Buffer Object7.1.5.2 Image Object7.1.5.3 Image object vs. buffer object7.1.5.4 Use of both Image and buf…

C語言數據結構-雙向鏈表

文章目錄 1 雙向鏈表的結構2 雙向鏈表的實現2.1 定義雙向鏈表的數據結構2.2 打印鏈表2.3 初始化鏈表2.4 銷毀鏈表2.5 尾插,頭插2.6 尾刪,頭刪2.7 根據頭次出現數據找下標2.8 定點前插入2.9 刪除pos位置2.10 定點后插入 3 完整代碼3.1 List.h3.2 Lish.c3.3 test.c 1 雙向鏈表的結…

ajax中get和post的區別,datatype返回的數據類型有哪些?web開發中數據提交的幾種方式,有什么區別。百度使用哪種方式?

在Ajax中&#xff0c;GET和POST是兩種常見的HTTP請求方法。它們有以下區別&#xff1a; GET請求&#xff1a;使用GET請求時&#xff0c;參數數據會附加在URL的末尾&#xff0c;以查詢字符串的形式發送給服務器。GET請求是冪等的&#xff0c;也就是說多次發送相同的GET請求&…

鍵盤打字盲打練習系列之矯正坐姿——4

一.歡迎來到我的酒館 盲打&#xff0c;矯正坐姿&#xff01; 目錄 一.歡迎來到我的酒館二.繼續練習二.矯正坐姿1.鍵鼠快速選購指南2.椅子快速選購指南 三.改善坐姿建議 二.繼續練習 前面的章節&#xff0c;我們重點向大家介紹了主鍵盤區指法和鍵盤鍵位。經過一個系列的教程學習…

Mybatis環境搭建

1、開發環境 IDE&#xff1a;IntelliJ IDEA 2022.2.1 (Ultimate Edition) 構建工具&#xff1a;maven 3.6.1 MySQL版本&#xff1a;MySQL 5.7 MyBatis版本&#xff1a;MyBatis 3.5.14 2、工程創建 創建一個Maven工程giser-java-mybatis-demo 基礎依賴如下&#xff1a; &…

【Python】pip命令及使用

PIP命令 下面是一個整理成表格的pip命令及使用的示例&#xff1a; 命令使用示例說明pip install <package>pip install requests安裝名為"requests"的包pip uninstall <package>pip uninstall requests卸載名為"requests"的包pip listpip li…

用友U8 Cloud 多處反序列化RCE漏洞復現

0x01 產品簡介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成長型、創新型企業,提供企業級云ERP整體解決方案。 0x02 漏洞概述 用友U8 Cloud存在多處(TableInputOperServlet、LoginServlet 、FileTransportServlet、CacheInvokeServlet、ActionHandlerServlet、Servle…

12.9每日一題(備戰藍橋杯循環結構)

12.9每日一題&#xff08;備戰藍橋杯循環結構&#xff09; 題目 2165: 求平均年齡題目描述輸入輸出樣例輸入樣例輸出來源/分類 題解 2165: 求平均年齡題目 2166: 均值題目描述輸入輸出樣例輸入樣例輸出來源/分類 題解 2166: 均值題目 2167: 求整數的和與均值題目描述輸入輸出樣…

GB/T 43212-2023 竹炭板檢測

竹炭塑復合板是指以竹炭粉為主要原料&#xff0c;與塑料及其他助劑復配混合&#xff0c;經熔融擠出或模壓成型等工藝制成的板材。 GB/T 43212-2023 竹炭板測試&#xff1a; 測試項目 測試方法 外觀 GB/T 43212 尺寸 GB/T 19367 含水率 GB/T 17657 密度 GB/T 17657 吸…

【rabbitMQ】springboot整合rabbitMQ模擬簡單收發消息

目錄 1.創建項目和模塊 2.添加rabbitMQ依賴 3.啟動rabbitMQ服務 4.引入rabbitMQ服務端信息 5.通過單元測試模擬業務發送消息 6. 接收消息 1.創建項目和模塊 2.添加rabbitMQ依賴 <!-- rabbitmq依賴--> <dependency> <groupId>org.sp…

JavaEE 09 鎖策略

1.鎖策略 1.1 樂觀鎖與悲觀鎖 其實前三個鎖是同一種鎖,只是站在不同的角度上去進行描述,此處的樂觀與悲觀其實是指在預測的角度上看會發生鎖競爭的概率大小,概率大的則是悲觀鎖,概率小的則是樂觀鎖 樂觀鎖在加鎖的時候就會做較少的事情,加鎖的速度較快,但是消耗的cpu資源等也會…

排序算法-選擇/堆排序(C語言)

1基本思想&#xff1a; 每一次從待排序的數據元素中選出最小&#xff08;或最大&#xff09;的一個元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的 數據元素排完 。 2 直接選擇排序: 在元素集合 array[i]--array[n-1] 中選擇關鍵碼最大 ( 小 ) 的數據元素…

PHP基礎 - 數組遍歷與排序

介紹 在PHP中,數組遍歷和排序是常見的操作,用于對數組中的元素進行訪問和排序 數組遍歷 1)數值數組的遍歷 使用 foreach 循環遍歷數組:foreach 循環是最常用的遍歷數組的方法,它可以遍歷索引數組和關聯數組。例如:$fruits = array("apple", "banana&q…

AG1KLPQ48 User Manual

1.&#xff09;軟件安裝&#xff1a; 解壓縮或執行安裝文件&#xff0c;安裝 Supra 軟件。執行文件為 bin 目錄中的 Supra.exe。 運行 Supra&#xff0c;選擇菜單 File -> Import license&#xff0c;選擇 license 文件并導入 License。 2.&#xff09;新建項目&#xff1a;…

Python與CAD系列高級篇(二十一)批量將橫向文本改豎向

0 簡述 本篇介紹以下功能開發:一次性選擇所有橫向文本并批量修改為豎向。 1 需求 需求: ① 用戶在cad中交互式選擇所有需要修改方向的文本。 ② 將所有文本方向由橫向改為豎向。 2 代碼實現 代碼實現: import win32com.client as win32 import pythoncomdef vtpnt(x, y, …