原型繼承 – JavaScript 完全手冊(2018版)
小編推薦: ofollow,noindex">掘金是一個面向程式員的高質量技術社群,從 一線大廠經驗分享到前端開發最佳實踐,無論是入門還是進階,來掘金你不會錯過前端開發的任何一個技術乾貨。
注:本文為 《 JavaScript 完全手冊(2018版) 》第11節,你可以檢視該手冊的完整目錄。
JavaScript 在流行的程式語言中非常獨特,因為它使用了原型繼承。 讓我們找出這意味著什麼。
雖然大多數面向物件的語言使用基於類的繼承模型,但 JavaScript 基於原型繼承模型。
這是什麼意思呢?
每個 JavaScript 物件都有一個名為 prototype
的屬性,它指向不同的物件。
這個不同的物件就是 物件原型 。
我們的物件使用該物件原型來繼承屬性和方法。
假設您使用物件字面量語法建立了一個物件:
const car = {}
或者使用 new Object()
語法建立:
const car = new Object()
在任何情況下, car
的 prototype(原型) 是 Object
:
如果初始化一個數組,陣列其實也是一個物件:
const list = [] //or const list = new Array()
這裡 list
的 prototype(原型) 是 Array
:
您可以通過檢查 __proto__
getter 來驗證這一點:
car.__proto__ == Object.prototype //true car.__proto__ == new Object().__proto__ //true list.__proto__ == Object.prototype //false list.__proto__ == Array.prototype //true list.__proto__ == new Array().__proto__ //true
我在這裡使用 __proto__
屬性,這是歷史遺留的非標準的語法,但在現代瀏覽器中廣泛實現。獲得原型的更可靠方法是使用 Object.getPrototypeOf(new Object())
;例如:
const car = {} const list = [] console.log(Object.getPrototypeOf(car)); console.log(Object.getPrototypeOf(list));
我們可以在控制檯中看到,他們的 constructor
屬性分別是 Object()
和 Array()
;
原型中的所有屬性和方法對於擁有原型的物件都是可用的:
Object.prototype
是所有物件的基本原型:
Array.prototype.__proto__ == Object.prototype //true
如果你想知道 Object.prototype
的原型是什麼,那就沒有原型。 這是一種特殊的,獨一無二的的物件。(❄️)
您看到的上面的示例是工作中的原型鏈的示例。
我可以建立一個物件來擴充套件 Array 的物件,和任何我用它例項化的物件,在其原型鏈中將包含 Array
和 Object
,並從所有祖先繼承屬性和方法。
除了使用 new
運算子建立物件,或使用物件和陣列的字面量語法之外,還可以使用 Object.create()
例項化物件。
傳遞的第一個引數是用作原型的物件:
const car = Object.create({}) const list = Object.create(Array)
您可以使用 isPrototypeOf()
方法檢查物件的原型:
Array.isPrototypeOf(list) //true Object.isPrototypeOf(list) //false
請注意,因為您可以使用以下方式例項化一個數組
const list = Object.create(Array.prototype)
在這種情況下, Array.isPrototypeOf(list)
為 false
,而 Array.prototype.isPrototypeOf(list)
為 true
。
關於 JavaScript prototype(原型) 的相關知識,可以檢視 JavaScript Prototype(原型) 新手指南 詳細瞭解。