兩張圖解釋原型與原型鏈

来源:https://www.cnblogs.com/cmk1018/archive/2019/08/13/11347442.html
-Advertisement-
Play Games

上面這張圖出自 "冴羽的博客" ,這張圖已經能很好地解釋原型與原型鏈了,其涉及到的屬性如下: : 每個函數都有一個 prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共用的屬性和方法,如果使用這個函數生成了實例,那麼稱這個對象為所有實例的 ...



上面這張圖出自 冴羽的博客,這張圖已經能很好地解釋原型與原型鏈了,其涉及到的屬性如下:

  • prototype: 每個函數都有一個 prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共用的屬性和方法,如果使用這個函數生成了實例,那麼稱這個對象為所有實例的原型。
  • __proto__: 每個對象都擁有__proto__屬性,該屬性用於實現原型鏈,當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,就通過原型鏈找直到找到或者到終點 null。
  • constructor:每個原型都有一個 constructor 屬性指向關聯的構造函數

我們可以用下麵這段代碼驗證一下:

function Person () {

}

let person = new Person()
console.log(person.__proto__ === Person.prototype) // true
console.log(Person.prototype.constructor === Person) // true
console.log(Person.prototype.__proto__ === Object.prototype) // true

下麵這張圖咱自己畫的,主要是分析下 Object 與 Function 的原型問題:
所有的對象都是由 Object() 構造函數構造的,所有的函數聲明 / 函數表達式都是 Function() 構造函數的實例,而 Object() 構造函數本身又是 Function() 構造函數的實例,其原型關係如下:

需要註意的是 Function() 的__proto__屬性直接指向的是其原型對象。
我們可以用下麵的代碼來驗證這張圖:在 node 環境及瀏覽器環境下都是一樣的結果

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概覽 mediaDevices 是 Navigator 對象的只讀屬性,一個單列對象,可以連接訪問相機和麥克風,屏幕共用等媒體輸入設備 方法 enumerateDevices 請求一個可用的媒體輸入和輸出設備列表,如麥克風、相機、耳機等。返回的 完成狀態中是一個帶有 "MediaDeviceInfo ...
  • 原型鏈 對象 對象: 1,函數對象:有function創造出來的函數 2,普通對象:除開函數對象之外的對象,都是普通對象 即普通對象obj是構造函數Object的一個實例,因此: obj.__proto__ === Object.prototype ` 但凡通過new Function()創建 的對 ...
  • 一、swich case判斷語句eg // 只有exp和值1或值2類型相同時,才能執行,否則會跳到default關鍵字處,執行對應代碼段; 註:default關鍵字:規定不存在 case 匹配時所運行的代碼。 二、if else if 註:if中條件可以是有多個,用&&或||隔開; 三、if els ...
  • 迴圈語句分類{ for while do ( ) while } 一、for迴圈語句和for迴圈的嵌套 for迴圈格式eg: 表達式“i=1”共運行1次,在迴圈之前運行; 表達式“i<=100”是判斷能否滿足執行迴圈體的條件,如果滿足,迴圈多少次就執行多少次,不滿足時跳出迴圈體; 表達式“i++”進 ...
  • 問題描述: 使用vue-cli創建的項目,開發地址是localhost:8080,由於後臺開發不同的模塊,導致每個模塊請求的ip和埠號不一致 例如:http://192.168.10.22:8081 或者 http://192.168.10.30:9999等 解決問題: 在vue.config.j ...
  • 一、for迴圈 1.單個for迴圈: for(初始值;條件;增量){ 語句 } 初始值:無條件的執行第一個表達式 條件:是判斷是否能執行迴圈體的條件 增量:做增量的操作 //迴圈輸出1~100之間數字的和 var sum=0; for(var i=1;i<=100;i++){ sum= sum+i; ...
  • github 獲取更多資源 https://github.com/ChenMingK/WebKnowledges Notes 線上閱讀:https://www.kancloud.cn/chenmk/web knowledges/1080520 垃圾回收機制 對垃圾回收演算法而言,其核心思想就是如何判斷 ...
  • Introduction 技術棧:react + redux + react router + express + Nginx 練習點: redux 連接 react router 路由跳轉 scss 樣式書寫 容器組件與展示組件的設計 express 腳手架項目結構設計 用戶信息持久化(cooki ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...