原型繼承+原型鏈 + 對象繼承發展

一、原型繼承:

  1、說起原型繼承,就要先由構造函數創造對象說起,首先了解構造函數內部基本原理:

      (1).在函數體最前面隱式的加上this = {}

      (2).執行 this.xxx = xxx;

      (3).隱式的返回this

    并且要注意隱士創建的this對象中有個名為__proto__的屬性,其屬性值為該構造函數繼承的原型prototype。

    而原型對象的有一個名為constructor的屬性,其屬性值為繼承之的構造函數,

    所以可以通過這兩個屬性相互查看

  2.原型的定義及一些特點:

    a.定義:原型是function對象的一個屬性,它定義了構造函數制造出的對象的公共祖先。通過該構造函數產生的對象,可以繼承該原型的屬性和方法。原型也是對象。

    b.利用原型特點和概念,可以提取共有屬性。

?

    c.對象如何查看原型 — > 隱式屬性 __proto__

?

    d.對象如何查看對象的構造函數 — > constructor

  3、若一個構造函數沒有指定其原型,則其原型默認為Object.prototype

二、原型鏈:

  1.原型的形成,最好的解釋就是代碼了,看如下代碼即可

  

A.protorype = {name: 'a'}function A() (this.name = 'A';)B.prototype = new A();function B() {this.name = 'B';}C.prototype = new B();function C(){this.name = 'C';}C繼承B,B繼承A,形成C->B->A的一條以原型為繼承方式的原型鏈

?

?

  2、原型鏈上屬性的增刪改查:

    (1)查:優先去實例對象上尋找是否有該屬性,若沒有,則再去其對應的原型上去尋找該屬性,若都沒有,則返回undefined

    (2)增:直接給實例對象增添屬性,則僅僅在實例對象上增添屬性,若在原型上增添屬性,則在原型上增添屬屬性,則在原型上增添屬性,其實例繼承原型增添的屬性。

    (3)刪:delete僅僅能刪除實例對象的屬性,即構造函數原有的自己的屬性和后來實例對象增添的屬性,還有關于delete的一點需注意,delete無法刪除原型的屬性和用var定義的變量(即非window的屬性)

?    ?(4)改:更改實例對象的屬性,則僅僅更改實例對象的屬性值;更改原型的屬性值,則更改原型的屬性值,繼承該原型的對象對應屬性值也會被更改;

三、對象繼承的發展:

  1、傳統模式:即正常的通過構造函數創建實例對象,來繼承原型

    缺點:繼承了過多不必要的屬性

  2、借用其他構造函數(即通過call / apply來改變構造函數內this對象的引用)

    缺點:無法繼承借用構造函數的原型

    

  A.prototype = {name: 'a',age: 18,class: 1}function A(){this.name = 'A';}function B(){A.call(this);}var b = new B();console.log(b.name); // Aconsole.log(b.age) // undefined

?

  3、共享原型:即將其他構造函數的原型直接賦值給本構造函數的原型

    缺點:兩個原型會想回影響,更改其中一個原型,更一個對應的原型也會被更改。

  

  A.prototype = {name: 'a',age: 18,class: 1}function A(){this.name = 'A';}B.prototype = A.prototype;function B(){this.name = 'B';}
  C.prototype = A.prototype;
  function C() {
    this.name = "C";
  }
var a = new A();var b = new B();
var c = new C();console.log(a.age);
// 18console.log(b.age); //18
console.log(c.age); //18

// 原型繼承成功B.prototype.age = 20; //更改其中一個原型的age屬性console.log(b.age);//20console.log(c.age); //20// 繼承A原型的B和C相互影響

?

  4、圣杯模式:

     每次繼承的都是新創建的F構造函數實例,相互之間不會影響。其實此處針對F形成了閉包,Child引用了F,導致F不會銷毀。

    (1)正常函數形式:

    

  function inherit (Child, Parent) {// 借用F這個中間量來繼承,而不是直接共享原型var F = function (){}F.prototype = Parent.prototype;Child.prototype = new F();// 自定義構造函數原型時,同時要更正自定義原型的constructor,否則一般默認為Object(),次函數若不指定constructor,則constructor為ParentChild.prototype.constructor = Child; Child.prototype.uber = Parent; //記錄真正繼承的是誰}

?

    (2)閉包形式:

    

    var inherit = (function(){var F = function (){};return function (Child, Parent) {F.prototype = Parent.prototype;Child.prototype = new F();Child.prototype.constructor = Child;Child.prototype.uber = Parent;}})();

?

轉載于:https://www.cnblogs.com/Walker-lyl/p/5592048.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin之?和!!最簡單的理解

一、? 1&#xff09;、?在聲明對象時&#xff0c;把它跟在類名后面&#xff0c;表示這個類允許為null var list: ArrayList<String>? null 2&#xff09;、調用對象時&#xff0c;把它跟在對象后面&#xff0c;表示如果為null程序就會視而不見&#xff0c;比如我們…

WPF|一個比較簡單帶點設計的登錄界面

閱讀目錄效果展示準備簡單說明 源碼結尾&#xff08;視頻及源碼倉庫&#xff09;1. 效果展示欣賞效果&#xff1a;2. 準備創建一個WPF工程&#xff0c;比如站長使用 .NET 7[1] 創建名為 Login5 的WPF項目。找一張圖片做為裝飾&#xff0c;放登錄表單左側&#xff1a;添加Nuget…

Android插件基礎之類加載器學習

記錄學習java 加載器學習所獲心得&#xff0c;逐步記錄了解java加載器的過程。為了知悉android 插件化的實現原理&#xff0c;從而需要從頭了解android加載apk&#xff0c;以及基礎的java類加載的加載過程情況&#xff0c;為方便記錄和記憶&#xff0c;故此將學習了解的過程記錄…

php多個文件上傳代碼,PHP單文件上傳類或多文件上傳類源碼

以下為引用的內容&#xff1a;php文件:代碼://如果收到表單傳來的參數&#xff0c;則進行上傳處理&#xff0c;否則顯示表單if(isset($_FILES[uploadinput])){//建目錄函數&#xff0c;其中參數$directoryName最后沒有"/"&#xff0c;//要是有的話&#xff0c;以/打散…

《看聊天記錄都學不會C語言?太菜了吧》(13)(9*9 乘法表)尋找電腦中的盲盒彩蛋

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

Fragment使用--文章集錦

android使用Fragment實現底部菜單使用show()和hide()來切換以保持Fragment狀態Android Fragment 真正的完全解析&#xff08;上&#xff09;Android Fragment實踐(一)糾正對Fragment Transaction BackStack的誤解多個Fragment 切換時不重新實例化Fragment詳解之四——管理Fragm…

Android之在在EditText的xml里面配置了相關屬性依然沒有顯示光標問題

1 問題 在EditText的xml里面配置了 android:cursorVisible"true" android:focusable"true" android:focusableInTouchMode"true" 依然沒有光標顯示 2 解決辦法 直接在代碼層控制&#xff0c;平且拉起鍵盤 fun showSoftInputFromWindow(activ…

【經典回放】多種語言系列數據結構線性表之二:鏈表

目錄 1 鏈表結構設計 2 簡單的鏈表測試 2 鏈表的組織和ADT設計 3 初始化有頭結點鏈表 4 有頭結點鏈表中追加一個結點(一行數據)

使用 Postman 實現 API 自動化測試

1背景介紹 相信大部分開發人員和測試人員對 postman 都十分熟悉&#xff0c;對于開發人員和測試人員而言&#xff0c;使用 postman 來編寫和保存測試用例會是一種比較方便和熟悉的方式。但 postman 本身是一個圖形化軟件&#xff0c;相對較難或較麻煩&#xff08;如使用 …

php json -gt;訪問,【轉】Php+ajax+jsonp解決ajax跨域問題

首先&#xff1a;jsonp是json用來跨域的一個東西。原理是通過script標簽的跨域特性來繞過同源策略。發送端&#xff1a;$.ajax({type : "post",url : "ajax.php",dataType : "jsonp",jsonp: "callback",//傳遞給請求處理程序或頁面的&…

《看聊天記錄都學不會Python到游戲實戰?太菜了吧》(1)加載Python神器!亮劍!

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

little tricks(持續更新)【python】

python中的list有reverse方法&#xff0c;但是字符串卻沒有&#xff0c;怎么辦呢&#xff1f; csdn博主有列了幾個方法&#xff0c;我覺得第一個最簡單直接&#xff0c;str[::-1]搞定。 當然也有一種怪異的方法&#xff0c;我把字符串轉為序列reverse一下&#xff0c;再轉回來不…

Codeigniter 3 拓展HMVC

2019獨角獸企業重金招聘Python工程師標準>>> 在Codeiniter&#xff08;以下統稱CI&#xff09; 2.X版本中&#xff0c;我們就通過拓展核心類庫實現了HMVC&#xff0c;但是同樣的代碼&#xff0c;拿到CI 3中&#xff0c;就很有可能不好用了。 ###拓展核心類庫方式 官…

FPGA FIFO深度計算

轉自&#xff1a;http://comm.chinaaet.com/adi/blogdetail/37555.html 首先&#xff0c;一定要理解清楚FIFO的應用場景&#xff0c;這個會直接關系到FIFO深度的計算&#xff0c;如果是面試官拋出的問題&#xff0c;那么有不清楚的地方&#xff0c;就應該進行詢問。如果是筆試或…

玩轉ASP.NET Core 6.0框架-序言

ASP.NET Core是微軟提供的強大的web框架&#xff0c;它有很多潛在的強大而有用的功能。本專欄的目標是幫助您把框架的隱藏能力最大限度地發揮出來&#xff0c;讓您能夠按需定制ASP NET Core框架。本專欄提供了一種具體的操作和實現方法&#xff0c;可以讓你在短時間盡可能地提高…

從C#開始的面向對象編程經典自學教程

1、C語言的時代 在C語言時代,可以認為那時的編程過程就是表格加工過程,也就是從A表格到B表格、再到C表格…..等等,這個過程中,計算機語言如何描述一個表格,成為計算機語言的關鍵。 對一個表格的分析可以發現:表格是兩部分組成:表頭和表格: 學生表 STUDENT 在這個表格…

Java之對List里面的對象名字進行模糊查詢

1 問題 對list里面的對象名字進行模糊查詢 2 解決辦法 //即可以進行模糊匹配matcher.find()//匹配查詢matcher.matches() /*** 模糊查詢*/public static ArrayList<SearchBean> search(String name, List<SearchBean> list) {ArrayList<SearchBean> results…

《看聊天記錄都學不會Python到游戲實戰?太菜了吧》(2)在python中加號竟然如此善變

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

mysql數據庫rp集群,使用MySQL-Cluster搭建MySQL數據庫集群

1、MySQL集群的作用&#xff1a;- 解決訪問節點的單點故障- 數據存儲節點的單點故障- 解決數據存儲節點數據備份問題2、集群&#xff1a;使用一組服務器提供相同的服務3、關于MySQL-Cluster&#xff1a;MySQL官方提供的集群版本已集成標準版MySQL程序&#xff0c;可獨立安裝使用…

桌面虛擬化云技術將支撐數字化醫院

桌面虛擬化云技術將支撐數字化醫院 2013-12-04 10:32 現今醫療行業已經從醫院——患者的二元關系走向從醫院——患者——政府監督——醫療保險的多元關系&#xff0c;醫療體系需要更高效的運轉&#xff0c;患者需要更好的就醫體驗&#xff0c;這使得醫療行業信息化建設的重要性…