總結javascript基礎概念(三):js對象原型鏈

来源:https://www.cnblogs.com/banyue/archive/2018/02/11/8443031.html
-Advertisement-
Play Games

主要問題:1、構造函數和普通函數有區別麽?什麼區別?2、prototype和__proto__有什麼不同?3、instanceof的作用機制,為什麼有限制?4、ES6的相關方法,Class繼承原理? ...


 

主要問題:
1、構造函數和普通函數有區別麽?什麼區別?
2、prototype和__proto__有什麼不同?
3、instanceof的作用機制,為什麼有限制?
4、ES6的相關方法,Class繼承原理?

 

三、對象與原型

 

(一)、數據類型
Js共有6種數據類型:

  5種基本數據類型 undefined,null,string,number,Boolean

  1種複雜數據類型 Object

Object 數據類型可以分為兩種:

  函數(包括各種原生、自定義的構造函數):Object(),Function(),Array(),Date(),,,

  對象實例(由函數創建的):  {,,},[,,]...

 

(二)、創建對象

<script>
    var Person = function () { };
    var p = new Person();
</script>

很簡單的一段代碼,我們來看看這個new究竟做了什麼?我們可以把new的過程拆分成以下三步:
  <1> var p={}; 也就是說,初始化一個對象p。
  <2> p.__proto__=Person.prototype;
  <3> Person.call(p); 也就是說構造p,也可以稱之為初始化p。//執行構造函數的一步

  說明:對象可以通過函數來創建。對象都是通過函數創建的。

   每個函數都有一個prototype屬性,指向一個對象,對象預設只有一個叫做constructor的屬性,指向這個函數本身。

  Object是最頂級的構造函數,prototype對象裡面,就有好幾個其他屬性。

  每個對象都有一個__proto__,可成為隱式原型。

自定義函數的prototype本質上就是普通對象實例,都是被Object創建,所以它的__proto__指向的就是Object.prototype。

Object.prototype確實一個特例——它的__proto__指向的是null。

 

 (三)、instanceof

<script>
	function B(){};
	var A = new B();
	console.log(A instanceof B);
</script>

  Instanceof運算符的第一個變數是一個對象,暫時稱為A;第二個變數一般是一個函數,暫時稱為B。
  Instanceof的判斷隊則是:沿著A的__proto__這條線來找,同時沿著B的prototype這條線來找,如果兩條線能找到同一個引用,即同一個對象,那麼就返回true。如果找到終點還未重合,則返回false。
  所以instanceof 無法檢測不同iframe創建的對象實例。

 

(四)、ES6新方法,新特性
Object.setPrototypeOf(),Object.getPrototypeOf()。新增加幾個方法直接操作對象的__proto__屬性,實現對象之間的聯繫。
Class的對象語法糖,模仿面向對象的語法,勉強提供了JS中的類的概念。然而並沒有改變原型鏈的實質,只是更加隱藏的更深。

 

(五)、繼承與委托
與純凈面向對象的語言不同,JS本質並沒有類和實例的概念。JS中一切皆對象(除了少數基本類型),是真正的面向“對象”。
構造函數與普通函數並沒有區別,只是調用方式不同。
與竭力模仿面向對象的方式來使用JS,使得代碼繼承邏輯十分複雜抽象。
相比之下,使用委托的思想,直接修改對象的__proto__屬性指向,來訪問委托對象上的屬性和方法,在邏輯上更簡潔直觀。


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

-Advertisement-
Play Games
更多相關文章
  • 我們搭建好Zabbix伺服器創建了監控項和觸發器之後,如何使用郵箱達到報警功能?本文使用mail作為郵件發送工具。 下麵將介紹,如何安裝和配置郵箱。 話不多說,就是乾!我們分兩步,第一步安裝mail郵件發送工具,第二步配置Zabbix伺服器發送報警郵件 一、mail安裝和設置 安裝郵件支持功能 安裝 ...
  • 第一步:配置環境變數(我的解壓路徑:G:\mysql\mysql-5.7.21-winx64 ) MYSQL_HOME=你解壓的路徑 PATH = ;%MYSQL_HOME %\bin; PATH變數是在原來的基礎上多添加的,不要把其它的設置給刪掉了 第二步在解壓的目錄下添加my.ini 文件(如果 ...
  • 一、Spark on Standalone 1.spark集群啟動後,Worker向Master註冊信息 2.spark-submit命令提交程式後,driver和application也會向Master註冊信息 3.創建SparkContext對象:主要的對象包含DAGScheduler和Task ...
  • TRUNCATE(X,Y) TRUNCATE(x,y)返回數值x保留到小數點後y位的值(與ROUND最大的區別是不會進行四捨五入),請看下麵實例: ...
  • html中,js註冊監聽和回調 java中,註冊監聽和回調 java給js發消息,不接收js響應 java給js發消息,接受js響應 js給java發消息,不接收java響應 js給java發消息,接受java響應 js中打開文件的書寫 java中,需要設置 java中,當前activity的onA ...
  • 當ScrollView鑲嵌listview會顯示不全,通過查看ScrollView測量高度的源碼,會發現ScrollView重寫了父類viewGroup的measureChildWithMargins方法: 測量child的高度,傳遞的是UNSPECIFIED(儘可能大的) 再來看看listview ...
  • 效果圖 背景 在公司做的項目裡面,剛好有需要用到微信聊天界面長按彈框樣式這種UI的。 網上找了一下,沒找到。 Android現成的 "ListPopupWindow" 又不能滿足需求。 因此在非上班時間擼一個出來,供大家使用。 示例代碼 關鍵文件、示例代碼及使用方法等我都放到github上了。 這篇 ...
  • <html></html> <body></body> <h1> this is the first heading </h1>..<h5> this is heading 5</h5> <p> this is a paragraph </p><p> this is another </p> 鏈接< ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...