1. 程式人生 > >JavaScript原型鏈與繼承內容總結

JavaScript原型鏈與繼承內容總結

總結

第三天:

1. JavaScript繼承

JavaScript繼承可以說是發生在物件與物件之間,而原型鏈則是實現繼承的主要方法;

1.1 原型鏈

利用原型讓一引用型別繼承另一個引用型別的屬性和方法。

建構函式中有個prototype(每個函式中都有),指向他的原型物件,每個原型物件中也有一個constructor屬性,指向原建構函式。通過建構函式建立的新物件中都有一個無法直接訪問的[[proto]]屬性,使得物件也指向建構函式的原型。這使得物件也獲得了原型中的方法和屬性。

  • 當訪問物件中的屬性或方法時,如果物件中沒有該屬性或方法,則會向上一級原型物件中尋找該屬性或方法,如果找了,就返回該屬性,若沒有則繼續向上面的原型中去查詢該屬性。

    1.2 建構函式的原型鏈繼承

    function Father(name,age){
    this.name=name;
    this.age=age;
    }
    Father.prototype.eat=function(){//給原型新增eat方法
    console.log(this.name+"吃飯了");
    }
    var f1=new Father("李四",20);//建立新物件f1,[[proto]]指向父原型
    
    function Son(){
    }
    Son.prototype=f1;//將子建構函式的prototype指向了父型別的物件,這裡實現了——繼承
     var s1=new Son();//建立子物件
    s1.eat
    ();           //李四吃飯了

注意:

①:當 Son.prototype指向Father的時候,他就已經是父型別的Son了。

②:s1.eat();s1中沒有此方法,該方法在父型別原型中,當s1訪問時,現在s1中查詢,若沒有則向他指向的原型中去查詢該方法,若還是沒有,則繼續往上面的原型中查詢。這樣就形成了一條原型鏈。

③:通過原型鏈實現了繼承。

簡寫:


var f1=new Father;
var Son.prototype=f1
//可以直接簡寫成:
var Son.prototypr=new Father();  //這個時候可以傳值進去 ,其餘地方無法傳值

1.3 預設頂端原型

預設的頂端原型:

  • 是當所有型別都沒有指明繼承某個型別時,則預設繼承Object型別。

  • objec中也有prototype指向他的object原型,object中也有[[proto]],只不過他指向的是null;可忽略。

  • object的很多方法,都是存在object的原型中;

  • 在原型鏈中查詢,從當前位置一直往上訪問,直到原型鏈頂端位置。

1.4 測試資料

  1. typeof 測資料的型別,最好只來測試基本型別資料,應為除了基本型別外全是返回object。

    console.log(typeof 123)  //number
    console.log(typeof "ccsa ")  //string
  2. instnaceof 測試一個物件屬不屬於其父類物件的型別

    function  Father(name){
    
    }
    var f1=new Father();
    
    console.log(f1 instanceof Father);//true

  3. isPrototypeOf(要測的物件) 專屬於原型物件的方法,判斷該物件在不在該原型鏈上,使用:父類建構函式.prototype.isPrototypeOf(物件)

    
    function Father(){
    
    }
    function Son(){
    
    }
    Son.prototype=new Father;
    var s1=new son();
    console.log(Father.prototype.isPrototypeOf(s1));   //true
    console.log(Object.prototype.isPrototypeOf(s1));   //true

1.5 借調

借調:借用建構函式呼叫冒充繼承,借調實現的繼承,不是真正的繼承,只是借用建構函式中的屬性或方法。

apply,call。

   function Fn(name,age){
      this.name=name;
      this.age=20;
    }
    function Son(name,age,sex){
  Fn.call(this,name,age)//借調繼承Fn;
  this.sex=sex;
};
var s1=new Son("李四",20,"男");
console.log(s1);  

注意:借調缺點:call是冒充繼承,不是真正的繼承,所以不能訪問原建構函式的原型中的屬性或方法。

1.6 組合繼承

組合建構函式的借調繼承和原型的繼承優點:


function Fn(name,age){
  this.name=name;//建構函式的屬性多樣
  this.age=age;
  if((typeof Fn.prototype.eat)!="funciton"){//判斷語句中是否有該方法,沒有則建立
Fn.prototype.eat=function(){//原型的方法共享
console.log(this.name+"吃了飯");
}
  }
}
function Son(name,age,sex){//建立子類建構函式
  Fn.call(this,name,age)//借調Fn()的屬性
  this.sex=sex;
};
Son.prototype=new Fn();//Son.prototype指向父類物件,實現了繼承,所以能夠呼叫eat方法,
var s1=new Son("李四",20,"男");//若沒有繼承,單單的使用call借調Fn繼承,子類例項s1無法呼叫eat方法
callconsole.log(s1); //因為call不是真正的繼承
s1.eat(); 

注意:Son.prototype=new Fn(); 這條語句 實現了Son繼承父型別Fn;Son指向的是父型別建立的物件,而父型別的物件有自己的屬性,並且又成為了子型別的原型,那麼其中的屬性不就成了共享的了嗎。 但是前面還有用到Fn.call( ),這條語句已經借調了父類建構函式屬性,相當於覆蓋了子型別原型的屬性。

相關推薦

JavaScript原型繼承內容總結

總結 第三天: 1. JavaScript繼承 JavaScript繼承可以說是發生在物件與物件之間,而原型鏈則是實現繼承的主要方法; 1.1 原型鏈 利用原型讓一引用型別繼承另一個引用型別的屬性和方

JavaScript原型繼承操作例項總結

本文例項講述了JavaScript原型鏈與繼承操作。分享給大家供大家參考,具體如下: 1. JavaScript繼承 JavaScript繼承可以說是發生在物件與物件之間,而原型鏈則是實現繼承的主要方法; 1.1 原型鏈 利用原型讓一引用型別繼承另一個引用型別的屬性和方法。

深入理解JavaScript原型繼承

原型鏈 原型鏈一直都是一個在JS中比較讓人費解的知識點,但是在面試中經常會被問到,這裡我來做一個總結吧,首先引入一個關係圖: 一.要理解原型鏈,首先可以從上圖開始入手,圖中有三個概念: 1.建構函式: JS中所有函式都可以作為建構函式,前提是被new操作符操作; function P

JavaScript 原型繼承

4.3 linu mod 管理員 art 狀態 ado 最好的 -s 用戶權限的相關命令: 權限類型: 01 讀 read r 4 02 寫 write w 2 03 執行 excute x 1 組權限: 開發組:將所有開發人員添加到一個組中,這個組中所有人就有

原型繼承

概念 blue cal null call 個數 true 程序設計 col 原型鏈(Prototype chain)  ECMAScript中描述了原型鏈的概念,並將原型鏈作為實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承裏一個引用類型的屬性和方法。簡單回顧下

JavaScript原型繼承

eat 過渡 存在 es6 向上 reset 保護 foo 創建 1.概念   JavaScript並不提供一個class的實現,在ES6中提供class關鍵字,但是這個只是一個語法糖,JavaScript仍然是基於原型的。JavaScript只有一種結構:對象。每

原型繼承(一):六種常見繼承模式

一、原型鏈繼承: function SuperType(){ this.colors = ["red", "blue", "green"]; } SuperType.prototype.Fun = function(){ }; function SubType(){ } //

js之原型繼承

js中的原型鏈是比較難理解的一部分知識,而繼承又是依賴於原型鏈,所以原型鏈是我們必須去掌握的。在學習原型鏈之前,我們需要去介紹一下原型。建議這部分重在理解,不推薦死記硬背。 1、原型 js中只有函式物件才有原型,原型也是個物件。例如,我們建立一個save函式,通過typeo

原型繼承(三):理解Object.create()

Object.create(proto[, propertiesObject]):接受兩個引數,返回一個物件引數一:proto應該是新建立物件的prototype引數二:可選。該引數物件是一組屬性與值,該物件的屬性名稱將是新建立的物件的屬性名稱,值是屬性描述符(這些屬性描述符

js 中的原型繼承

truct return cto 添加 函數繼承 相同 person nbsp 有一個 ECMAScript中將原型鏈作為實現繼承的主要方法,其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。 1、原型鏈 先回憶一下構造函數和原型以及實例的關系:每個構造函數

淺談JavaScript原型繼承方式閉包

JavaScript中的繼承方式有兩種,一種是通過call或apply方法借用建構函式,另一種方法則是通過原型來繼承。這篇文章用於梳理自己關於prototype繼承的知識點,也略微涉及一點點閉包的概念。 關於原型 在JavaScript中每當我們建立一個Fu

JavaScript學習總結(十七)——Javascript原型的原理

學習總結 swp 是個 個人 {} 內存地址 ret nlb SDR 一、JavaScript原型鏈   ECMAScript中描述了原型鏈的概念,並將原型鏈作為實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。在JavaScript中

JavaScript中的原型繼承

工具 call logs 不難 code 也會 str 最簡 創建子類 理解原型鏈 在 JavaScript 的世界中,函數是一等公民。 上面這句話在很多地方都看到過。用我自己的話來理解就是:函數既當爹又當媽。“當爹”是因為我們用函數去處理各種“粗活累活”(各種工具函

Javascript 類、原型繼承的理解

自己 test 參數 自動 3.3 圖片 返回值 面向 指向 一、序言 ??和其他面向對象的語言(如Java)不同,Javascript語言對類的實現和繼承的實現沒有標準的定義,而是將這些交給了程序員,讓程序員更加靈活地(當然剛開始也更加頭疼)去定義類,實現繼承。(以下不討

javascript原型繼承

UNC 返回值 object def fin java tostring cti 指向 當定義一個函數的時候,函數對象就會默認帶一個prototype對象屬性。 通過new去構造一個對象(obj),它的原型會指向構造器的prototype屬性(foo.prototype)。

明白JavaScript原型和JavaScrip繼承

creat oms 訪問 函數的原型 form eat sub rms amp 原型鏈是JavaScript的基礎性內容之一。其本質是JavaScript內部的設計邏輯。 首先看一組代碼: 1 <script type="text/javascript"&g

javascript原型物件原型

三張圖搞懂JavaScript的原型物件與原型鏈 對於新人來 說,JavaScript的原型是一個很讓人頭疼的事情,一來prototype容易與__proto__混淆,二來它們之間的各種指向實在有些複雜,其 實市面上已經有非常多的文章在嘗試說清楚,有一張所謂很經典的圖,上面畫了各種線條,一會連線

深入理解JavaScript原型原型繼承

建構函式,原型物件,例項物件三者之間的關係 1.建構函式可以例項化物件 2.建構函式中有一個prototype屬性,是建構函式的原型物件 3.原型物件(prototype)中有constructor構造器指向的是當前原型物件所在的建構函式 4.例項物件的__proto__原型指向建

JavaScript物件、原型繼承、閉包

什麼是面向物件程式設計 說到面向物件,每個人的理解可能不同,以下是個人對面向物件程式設計的理解: 對於面向物件程式設計這幾個字每一個前端都應該非常熟悉,但是到底應該如何去理解他呢?就程式設計方式而言,javascrip可以分成兩種發方式:面向過程和麵向物件,所謂的面向過程就是比較常用的函數語言程式設計,通

JavaScript對象、原型繼承、閉包

增強 版本 data- 命名沖突 lock .com text t對象 單體 什麽是面向對象編程 說到面向對象,每個人的理解可能不同,以下是個人對面向對象編程的理解: 對於面向對象編程這幾個字每一個前端都應該非常熟悉,但是到底應該如何去理解他呢?就編程方式而言,javasc