js原型(重點理解)

来源:https://www.cnblogs.com/liugrwit/archive/2022/10/23/16818675.html
-Advertisement-
Play Games

網路上很多關於JS原型的理解,寫了很多,我也看了很多,但總是雲里霧裡,很多文章一上來就說Object是一切對象的根對象,這句話非常誤導人的思維,後來自己在控制台,自己分析出來了比較好理解的方式,下麵我來詳細屢屢關於js原型的正確理解方式。 主要是理解js中的對象,函數,函數對象,函數實例 首先我們來 ...


  網路上很多關於JS原型的理解,寫了很多,我也看了很多,但總是雲里霧裡,很多文章一上來就說Object是一切對象的根對象,這句話非常誤導人的思維,後來自己在控制台,自己分析出來了比較好理解的方式,下麵我來詳細屢屢關於js原型的正確理解方式。

主要是理解js中的對象,函數,函數對象,函數實例

首先我們來聊聊這四個概念

對象

對象是什麼呢,對象就是使用json格式表示的代碼塊,用這種方式表示js中的對象如下:

{ "name":"runoob", "alexa":10000, "site":null }

JSON 對象使用在大括弧 {...} 中書寫。

對象可以包含多個 key/value(鍵/值)對。

key 必須是字元串,value 可以是合法的 JSON 數據類型(字元串, 數字, 對象, 數組, 布爾值或 null)。

key value 中使用冒號 : 分割。

每個 key/value 對使用逗號 , 分割。

函數

函數就是function關鍵字定義的一段代碼塊,就是自己定義的看得到的那一塊代碼,稱之為函數,js中內置了一些基礎函數比如(Object,Date等等),其實質就是帶有構造器constructor的對象,js中可以將一個帶有構造器constructor的對象表示為為函數,函數是json對象的變體表現形式

(註意:永遠不要忘記js中的對象就是json格式的代碼塊,函數是這個json格式對象的變體)

如下為Object函數的原型Object.prototype,也是一個json鍵值對對象:

{
{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
__proto__: null
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
}

函數有兩種作用:一是執行特定功能的代碼塊,二是構造對象

函數對象

函數對象就是函數的原型,要與函數本身區分開來,比如Date函數的函數對象為Date.prototype,後面我在說特定函數對象的時候都會加上.prototype,因為這個函數原型才真正表述為函數對象

函數實例

函數實例就是通過函數構造器創造的對象,一個函數可以構造出多個不同的但相似的函數實例對象,例如:

function myFunction(a, b) {
return a * b;
}
var x = myFunction (3, 3);
var y = myFunction (4, 3); 
從控制台可以分析出函數實例x,y是函數對象Number的子對象,其_proto_屬性指向的是Number.prototype,而不是我們通常認為的x,y為myFunction.prototype的子對象
當然這裡也不能絕對,因為函數實例的父對象是不確定的,如下實例
function myFunction2()
{
    console.log('nihao');
}
var z=myFunction2();
var m= new myFunction2();
VM360:3 nihao 
undefined
z
undefined
函數實例z返回的日誌為undefined
函數實例m返回的日誌為myFunction2 {}
以上可知通過new關鍵字構造的新對象其父對象才指向其構造函數對象

對象與函數的基本認識

對象的_proto_屬性指向的是當前對象的父對象

只有函數有constructorprototype屬性

函數中的prototype屬性字面意思是原型,指的是當前函數的對象原型,函數只是這個對象原型的變體形式

按照我的理解是這樣的,創造js這門語言的時候是定義這是一個面向對象的語言,所有首要任務就是指定對象的格式,就有json對象表示法,然後就是構造執行代碼塊的結構,即函數 表示法,再就是對象與函數的關聯,想象js一切皆為對象,函數的定義本身也是在構造對象,即定義的函數可以表示為帶有constructor的對象,這就是函數原型,然後通過函數定義法著手定義根對象就是Object.prototype以及其他的一些內置對象

關於Object與Object.prototype的理解

js中所有的對象繼承自Object.prototype這個原型對象,這個原型對象用函數表示就是Object,所以很多文章都Object為根對象,這也沒錯,因為Object表示的就是根,只是這個根是以函數的形式表示出來,而這個函數的原型就是真正的根對象,即Object.prototype:{…}(這個裡我省略了對象中的內容),這個Object.prototype派生了函數對象和普通對象(如Math,JSON等,因為這些對象中沒有構造器,可自行在控制台查看),永遠不要忘記Object這個函數是通過函數構造器構造出來的函數模樣的一塊代碼,其本質是Object.prototype這個原型,這才是根對象。

Object是一個函數,其屬性指針_proto_指向的是函數根對象ƒ () { [native code] },而函數根對象的_proto_則指向Object.prototype,應該有這樣的關係:Object._proto_._proto_===Object.prototype;

不過js在_proto_屬性後面就不讓指針跟蹤了,不過我們也可以通過變通的方式來查到,從這裡可以看出來:

Object._proto_===Function.prototype  //返回值都為ƒ () { [native code] };

Function.prototype.__proto__=== Object.prototype //返回值為true

Object.prototype._proto_則為null。

以上可以看出,JS中的一切對象都是Object.prototype的子對象,函數根對象ƒ () { [native code] }是Object.prototype的子對象,函數是函數根對象ƒ () { [native code] }的子對象,Object函數也不列外。(註意Function函數是函數根對象的顯式函數聲明,代表著函數根對象,函數根對象ƒ () { [native code] }是在js運行時已經定義好了的對象)

很多文章都說所有函數都派生自這個Function對象,準確的來說應該是所有函數對象派生自Function.prototype,而Function.prototype就是ƒ () { [native code] },那麼問題來了,Object也是函數,那它也是派生自這個對象嗎,是的,前面我已經說了,Object在js中寫的時候是個函數不是根對象,而這個函數的原型Object.prototype才是真正的根對象,其形式為:這個在函數概念那裡已經表述出來了,可以返回去鞏固鞏固。

關於JS Function函數理解

JS內置對象中,Function函數(註意我這裡表述的是函數而不是函數對象,因為Function的函數對象準確來說應該為Function.prototype)較為特殊,這個理解起來就比較困難,因為Function.prototype===Function._proto_,很多人很疑惑為什麼會等於,其實這裡還缺少了一個重要的信息,那就是ƒ () { [native code] },這個才是根函數對象,這個根函數對象的父對象指向的是Object.prototype這個根對象,這是在js運行時中就已經定義好的,而Function.prototype這個函數對象原型恰好就是這個根函數對象ƒ () { [native code] },而這個Function._proto_這個屬性指針恰好就指向了ƒ () { [native code] },這都是在js運行時中定義好了, Function這個函數的作用就是為了創建函數實例的另外一種方法,其父類對象還是Object.Prototype,只是顯式定義函數的多一種選擇。

 

好了,文章結束,希望對各位有所幫助!


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

-Advertisement-
Play Games
更多相關文章
  • 1.創建表 char 和 varchar 如何選擇? char 適用於數長度不會發生改變的時候,是定長的,例如:性別,生日varchar 當一個欄位數據長度不確定,例如:簡介、姓名、等都是採用varcharchar是直接開闢一定長度的空間,varchar是根據存儲數據的長度動態的開闢空間! 測試案例 ...
  • Mac上哪款PostgreSQL資料庫管理工具好用?PostgreSQL Mac版推薦給大家,它是一個現代化的PostgreSQL客戶端,提供了一個易於使用的界面,使Postgres更容易為新手和專家所操作。 詳情:Postico for Mac(PostgreSQL資料庫管理工具) Postico ...
  • 本文將介紹三種資料庫變慢場景的分析與優化方法. 1、已經定位出的特定慢SQL 2、整個資料庫實例(幾乎所有SQL)變慢, 或者某些時候整個資料庫實例大面積SQL變慢(大面積抖動) 3、某些正常情況下很快的SQL偶爾會變慢(抖動) ...
  • HTML (HyperText Markup Language,超文本標記語言) 不是一門編程語言,而是一種用於定義內容結構的標記語言,用來描述網頁內容,文件格式為.html。HTML 由一系列的元素(elements)組成,這些元素用來實現不同的內容。HTML5是HTML新的修訂版本,2014年由... ...
  • 函子(Functor) 函子是一個特殊的容器,通過一個普通對象來實現,該對象具有map方法,map方法可以運行一個函數對值進行處理(變形關係),容器包含值和值變形關係(這個變形關係就是函數)。函數式編程中解決副作用的存在 函數式編程的運算不直接操作值,,而是由函子完成 函子就是一個實現了map契約的 ...
  • 需求 實現sum函數,使其可以傳入不定長參數,以及不定次數調用 //示例 console.log(sum(1,2)(3)()) //6 console.log(sum(2,3,4,5)(1,2)(3)(4)()) //23 需求分析 實現sum函數我們可以考慮可以使用閉包的形式來實現 因為每次傳參, ...
  • 先上結論: 防抖 :只執行最後一次 (常用語輸入框) 節流: 控制執行的次數 (常下拉滾動條時進行數據請求) 防抖代碼: (這是未封裝的,防抖代碼和業務代碼寫在一起了) <body> <input type="text" /> <script> // 防抖:用戶觸發事件過於頻繁,只要最後一次事件的操 ...
  • 2022-10-21 第一個vue.js <!doctype html> <head> <title>Document</title> <!-- 開發環境 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...