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實現繼承
原型鏈繼承(無法設置參數)