原型與原型鏈

来源:https://www.cnblogs.com/wuvkcyan/archive/2018/04/26/8955353.html
-Advertisement-
Play Games

`今天看了github上面的某位大佬對原型與原型鏈的文章 講解很透徹` 文章下麵貼地址 prototype 每個函數都有prototype屬性,如下 這個函數的prototype到底是什麼呢,是函數的原型嗎? 其實,函數的prototype都會指向一個對象,這個對象 就是調用改構造函數而創建的 ,也 ...


今天看了github上面的某位大佬對原型與原型鏈的文章 講解很透徹 文章下麵貼地址

prototype

每個函數都有prototype屬性,如下

這個函數的prototype到底是什麼呢,是函數的原型嗎?

其實,函數的prototype都會指向一個對象,這個對象 就是調用改構造函數而創建的實例的原型,也就是上圖的a b的原型

什麼是原型呢?

每一個JavaScript對象(null除外)在創建的時候就會與之關聯另一個對象,這個對象就是我們所說的原型,每一個對象都會從原型"繼承"屬性。

用過一張圖來表示構造函數與實例之間的關係

那麼上面的變數 ab是怎麼訪問到score的prototype.name的呢?

這裡就要提出第二個屬性

___ proto ___

這是每個JavaScript對象都會有的屬性 叫做_ proto _ 這和屬性 指向該對象的原型 即是

JavaScript function score () {} score.prototype.name = "張三" var b= new score() b.__proto__.name //"張三"

這裡可以看到 b._ proto_ 是指向score.prototype的 或者我們可以證明

score.prototype == b.__proto__  //true

現在我們知道

構造函數 prototype 指向原型 構造函數可以生成實例 實例的 _ proto _ 指向原型

於是關係圖可以這麼理解

這裡構造函數 和 實例都指向 原型 那麼會不會有 原型指向構造函數與實例呢?

#### constructor

沒有指向實例的方法 因為 會有多個實例 但是有指向構造函數的方法 就是constructor 每個原型都有一個constructor屬性指向關聯的構造函數

可以看出來constructor指向構造函數本身

總結一下 現在得出結論

3

console.log(score.prototype.constructor == score)
console.log(score.prototype == a.__proto__)

再更新一下圖

實例與原型

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

function score () {}
score.prototype.age="20"    //在原型鏈上面賦值 age = 20
var a = new score()
a.age
"20"      //age指向原型鏈上面
a.age= "10" 
"10"      //這時候指向a實例上面
delete a.age;
a.age
"20"     //age指向原型鏈

當實例沒有age這個屬性 他會在原型鏈上面找

當給實例賦值的時候 就會覆蓋prototype上面的屬性 但是 prototype上面的屬性依舊存在

當將實例上面的age刪除的時候 就會依舊列印出原型鏈上面的屬性

這裡思考一個問題 JavaScript萬物皆對象 name prototype的對象是什麼呢?

原型的原型

我們已經講了原型也是一個對象,既然是對象,我們就可以用最原始的方式創建它

Object.prototype.name = "張三"
var obj = new Object();
console.log(obj.name) // 張三   //和上面同理 來自原型鏈上面的name
Object.prototype.constructor == Object

現在關係圖再次更新

原型鏈

那 Object.prototype 的原型呢?

console.log(Object.prototype.__proto__)
null

null 表示“沒有對象”,即該處不應該有值

所以 Object.prototype.proto 的值為 null 跟 Object.prototype 沒有原型,其實表達了一個意思。

最後整理關係圖

圖中由相互關聯的原型組成的鏈狀結構就是原型鏈,也就是藍色的這條線。

最讓人不註意的就是日常引用要註意的問題

首先 看下麵代碼

function score () {}
var a = new score()
console.log(a.constructor == score)

答案是 true

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

person.constructor === Person.prototype.constructor

學過java的人可能會將JavaScript的原型鏈理解為繼承 但是 JavaScript裡面一直以來都沒有這個說法

你不知道的JavaScript 裡面有一句話

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

原型與原型鏈


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

-Advertisement-
Play Games
更多相關文章
  • 今天需要用到資源文件,需要將資源文件拖拽到sd卡中,但老是出現這個問題: 資源文件拖不進去genymotion。查看了sd的DownLoad目錄,確實沒有成功拖拽進去。 遇到這種問題的,我按下麵的思路排查問題: Genymotion模擬器是基於VirtualBox的,看看是不是虛擬機禁用了拖放功能, ...
  • 小程式的客服系統,是微信做的非常成功的一個功能,開發者可以很方便的通過一行代碼,就可實現客服功能。 1. 普通客服按鈕添加 2. 懸浮客服按鈕添加,圖片自定義 大家看地圖的有個客服圖片圖片資源。大家去iconfont 網站去找一個就可以了 index.wxml index.wxss 芝麻小客服 小程 ...
  • 轉載自:http://blog.sina.com.cn/s/blog_7b9d64af0101dfg8.html 最近用到搜索功能。於是,經過不斷的研究,終於,有點懂了。 那就來總結一下吧,好記性不如爛筆頭! 搜索,無疑可以使用UISearchBar控制項!那就先瞭解一下UISearchBar控制項吧! ...
  • 再打開手機app的時候,最先映入我們眼帘的是一個覆蓋手機全屏的歡迎界面,在這個界面顯示出來的時候整個手機屏幕只會顯示這一個界面,上面的標題欄,以及手機最頂端的狀態欄都會消失,只有歡迎頁面結束跳轉到其他頁面時,標題欄和狀態欄才回又顯示出來。 現在我們就來製作一下歡迎界面。 歡迎界面的設置 首先,我們需 ...
  • 新編html網頁設計從入門到精通共分為21章,全面系統地講解了html的發展歷史及4.0版的新特性、基本概念、設計原則、文件結構、文件屬性標記、用格式標記進行頁面排版、使用圖像裝飾頁面、超鏈接的使用、使用表格組織頁面、使用多媒體美化頁面、創建多框架頁面、動態網頁的製作、使用層疊樣式表(css)美化頁 ...
  • HTML5已經廣泛應用於各智能移動終端設備上,而且絕大部分技術已經被各種最新版本的測覽器所支持:逐一剖析HTML5標準中包含的最新技術,詳細介紹了HTML5新標準中提供的各種API,各種各樣的應用實例,可以直接應用於自己的HTML5程式中。 HTML5移動開發即學即用(雙色)書中幾乎涵蓋了HTML5 ...
  • HTML5權威指南是一本系統學習網頁設計的權威參考圖書。《HTML5權威指南》分為五部分:第一部分介紹學習本書的預備知識和HTML、CSS和JavaScript的最新進展;第二部分討論HTML元素,並詳細說明瞭HTML5中新增和修改的元素;第三部分闡述CSS,涵蓋了所有控制內容樣式的CSS選擇器和屬 ...
  • 《HTML5移動Web開發實戰》提供了應對這一挑戰的解決方案。通過閱讀本書,你將瞭解如何有效地利用最新的HTML5的那些針對移動網站的功能,橫跨多個移動平臺。全書共分10章,從移動Web、設備端配置和優化,變互、響應式設計、設備訪問,調試、性能測試、富媒體等角度出發,包含了60多個實用的示倒,詳細闡 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...