js原型鏈的看法

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

原型鏈 對象 對象: 1,函數對象:有function創造出來的函數 2,普通對象:除開函數對象之外的對象,都是普通對象 即普通對象obj是構造函數Object的一個實例,因此: obj.__proto__ === Object.prototype ` 但凡通過new Function()創建 的對 ...


原型鏈

對象

對象:
1,函數對象:由function創造出來的函數
2,普通對象:除開函數對象之外的對象,都是普通對象
**即普通對象obj是構造函數Object的一個實例,因此:
obj.__proto__ === Object.prototype**

//普通對象
var obj = {}
var obj1 = new Object()
console.log(obj.__proto__ === obj1.__proto__); //true
console.log(obj.__proto__ === Object.prototype); //true

但凡通過new Function()創建 的對象都是函數對象,其他都是普通對象

**註意: 所有對象都有__proto__屬性,只有函數對象才有prototype屬性**

3,原型對象:prototype屬性也叫原型對象,主要為了實現繼承

**指針__proto__: js中,萬物皆對象!所有obj都具有proto屬性(null和undefined除外),而且指向創造obj對象的函數對象(生成實例的構造函數)的prototype屬性:**

function Person(name) {
this.name = name;
}
function Mother() {
}
Mother.prototype = { //Mother的原型
age: 18,
home: ['家裡蹲']
}
Person.prototype = new Mother() //Person的原型為Mother

Person 構造函數的原型對象 是 Mother ()。相當於原型(prototype)是媽媽,Person現在是兒子。


let a = new Person()
let b = new Person('豬腦殼子')
console.log(a.age); // 18
console.log(b.name, b.home); //豬腦殼子 ["家裡蹲"]
console.log(a.__proto__); //__proto__: age: 18 home: Array(1) 0: "家裡蹲"length: 1

**在a和b的實例中,__proto__屬性,指向的都是它們的構造函數Person對象的prototype屬性,所對應的對象也就是Mother()**

**一個構造函數對象的原型(prototype),就相當於他媽,這個構造函數對象的實例,就相當於他媽不同的孩子,而每個實例中的__proto__屬性,就指向它們共同的媽媽!也就是構造函數對象的prototype屬性**

****當我們輸入 b.name 的時候,原型鏈的搜索機制是先在實例中搜索相應的值找不到就通過它__proto__指針,在原型中找,還找不到就再往上一級原型中搜索……一直到了原型鏈的終點(就是js自帶的Object,它的原型比較特殊,為null ),就是到null還沒找到的話,就返回一個 undefined。****

構造器constructor : 每一個對象中的constructor 屬性返回創建此對象的函數對象的引用;例如:

function Cat(name,color) {
this.name = name;
this.color =color;
}
var cat1 = new Cat('小黑','白色')
console.log(cat1.constructor === Cat) //true
console.log(cat1); //Cat {name: "小黑", color: "白色"}

在預設情況下,所有的原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性(是一個指針)指向 prototype 屬性所在的函數(Person)

上面這句話有點拗口,我們「翻譯」一下:A 有一個預設的 constructor 屬性,這個屬性是一個指針,指向 Person。即:

Person.prototype.constructor === Person

實例的構造函數屬性(constructor)指向構造函數 :person1.constructor == Person

person1 為什麼有 constructor 屬性?那是因為 person1 是 Person 的實例。
那 Person.prototype 為什麼有 constructor 屬性??同理, Person.prototype (你把它想象成 A) 也是Person 的實例。
也就是在 Person 創建的時候,創建了一個它的實例對象並賦值給它的 prototype,基本過程如下:

var A = new Person();
Person.prototype = A;

結論:原型對象(Person.prototype)是 構造函數(Person)的一個實例。


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

-Advertisement-
Play Games
更多相關文章
  • 1 大數據概述大數據特性:4v volume velocity variety value 即大量化、快速化、多樣化、價值密度低 數據量大:大數據摩爾定律 快速化:從數據的生成到消耗,時間視窗小,可用於生成決策的時間非常少;1秒定律,這和傳統的數據挖掘技術有著本質區別(谷歌的dremel可以在1秒內... ...
  • 前面配置了ACFS用於ogg目錄。 上傳軟體並解壓安裝: unzip 123014_fbo_ggs_Linux_x64_shiphome.zip cd fbo_ggs_Linux_x64_shiphome/cd Disk1/./runInstaller 添加環境變數 su - oracle cat ...
  • [學習筆記] collect: 收集一個彈性分散式數據集的所有元素到一個數組中,這樣便於我們觀察,畢竟分散式數據集比較抽象。Spark的collect方法,是Action類型的一個運算元,會從遠程集群拉取數據到driver端。最後,將大量數據 彙集到一個driver節點上,將數據用數組存放,占用了jv ...
  • 前言 開心一刻 一個中國小孩參加國外的脫口秀節目,因為語言不通,於是找了一個翻譯。 主持人問:“Who is your favorite singer ?” 翻譯:”你最喜歡哪個歌手啊 ?” 小孩興奮地回答:”Michael Jackson” 翻譯轉身對主持人說:”邁克爾-傑克遜” 主持人看著翻譯: ...
  • 今天給大家講一下MaterialApp應用組件及routes路由詳解,我會著重說一下routes路由的使用及解釋,因為會經常用到,前面我寫的一些demo所涉及到的組件,都是遵循著Material Design設計風格,所謂的Material Design是由Goodle推出的全新的設計語言,這種設計... ...
  • 在smobiler中可以通過相對佈局或者絕對佈局實現自適應不同手機解析度。例如實現下圖中的佈局,圖中的佈局實際可以分成3個部分,部分1可以使用Title控制項,部分2可以使用Panel(在Panel中加入IconMenuView可以實現圖中效果,本文不具體說明),部分3 使用ToolBar控制項,具體見... ...
  • 還有一種簡單的扁平化實現方法,但不太推薦: 這樣就實現了該功能,有沒有其他方法也能實現該功能? 該方法是查閱得到,通過遞歸使數組扁平化,無需擔心瀏覽器不支持flat的使用,結尾的方法調用個人非常喜歡 ...
  • 概覽 mediaDevices 是 Navigator 對象的只讀屬性,一個單列對象,可以連接訪問相機和麥克風,屏幕共用等媒體輸入設備 方法 enumerateDevices 請求一個可用的媒體輸入和輸出設備列表,如麥克風、相機、耳機等。返回的 完成狀態中是一個帶有 "MediaDeviceInfo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...