js 原型、繼承整理

JavaScript 常被描述爲一種基於原型的語言 (prototype-basedanguage)——每個對象擁有一個原型對象,對象以其原型爲模板、從原型繼承方法和屬性。
原型對象也可能擁有原型,並從中繼承方法和屬性,一層一層、以此類推。這種關係常被稱爲原型鏈 (prototype chain),它解釋了爲何一個對象會擁有定義在其他對象中的屬性和方法。
準確地說,這些屬性和方法定義在Object的構造器函數(constructorfunctions)之上的prototype屬性上,而非對象實例本身。通過原型這種機制,JavaScript 中的對象從其他對象繼承功能特性

  • 在javascript中,每個函數都有一個特殊的屬性叫作原型(prototype)
  • 對象的原型可以通過Object.getPrototypeOf(obj)或者已被棄用的__proto__屬性獲得
  • prototype是函數纔有的屬性,__proto__屬性是對象的屬性,大多數情況下,__proto__ 可以理解爲“構造器的原型”,即__proto__===constructor.prototype,但是通過 Object.create()創建的對象有可能不是.

Object.create()方法創建一個新對象,使用現有的對象來提供新創建的對象的__proto__。

function Constructor(){}
o = new Constructor();
// 等價於:
o = Object.create(Constructor.prototype);
let obj1 = { a: 1 };
let obj2 = Object.create(obj1);
 console.log('obj2.constructor',obj2.constructor)
 console.log("obj2.__proto__:",obj2.__proto__); //Object {a: 1}

Object.getPrototypeOf(obj)
在ES5中,如果傳遞給方法的參數不是對象,則會拋出TypeError異常。
在ES6中,如果傳遞給方法的參數不是對象,則會強制類型轉換爲對象。

原型繼承、構造函數繼承、組合繼承

在這裏插入圖片描述

ES5實現繼承

  • 原型鏈(無法設置參數)
  • 借用構造函數
  • 組合繼承
  • 原型式繼承
  • 寄生式繼承
  • 寄生組合式繼承
    ES6實現繼承

原型鏈繼承(無法設置參數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章