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。