JavaScript因為使用原型繼承而在流行的程式語言中相當獨特。讓我們來看看這意味著什麼。

JavaScript因為使用原型繼承模型而在流行的程式語言中相當獨特。

這是什麼意思呢?

每個JavaScript物件都有一個被稱為prototype的屬性,指向另一個物件。

這個不同的物件就是物件原型

我們的物件使用這個物件原型來繼承屬性和方法。

假設你使用物件字面語法來創建物件:

const car = {}

或者使用new Object語法創建:

const car = new Object()

無論哪種方式,car的原型都是Object

如果你初始化一個陣列(也就是一個物件):

const list = []
//或
const list = new Array()

它的原型就是Array

你可以通過使用Object.getPrototypeOf()Object.prototype.isPrototypeOf()方法來驗證:

const car = {}
const list = []

Object.getPrototypeOf(car) === Object.prototype
Object.prototype.isPrototypeOf(car)

Object.getPrototypeOf(list) === Array.prototype
Array.prototype.isPrototypeOf(list)

原型的所有屬性和方法都可以在具有該原型的物件中使用:

Object.prototype是所有物件的基本原型:

Object.getPrototypeOf(Array.prototype) == Object.prototype

如果你想知道Object.prototype的原型是什麼,它是沒有原型的:它是null。這是個特別的存在 ❄️。

你所看到的例子是原型鏈的一個示例。

我可以創建一個擴展Array的物件,使用它實例化的任何物件都會在原型鏈中具有Array和Object,並繼承所有祖先的屬性和方法。

除了使用new操作符來創建物件,或者使用物件和陣列的字面語法,你還可以使用Object.create()來實例化物件。

傳遞的第一個參數是用作原型的物件:

const car = Object.create({})
const list = Object.create(Array)

請注意,你可以使用以下方式來創建一個陣列:

const list = Object.create(Array.prototype)

此時Array.isPrototypeOf(list)是false,而Array.prototype.isPrototypeOf(list)是true。