JavaScript 是一個以雛型為基礎 (Prototype-based) 的程式設計語言 (或更準確的說是以雛型為基礎的腳本語言),它採用了複製的模式而非繼承。(源自MDN)
在JS OOP中繼承概念使用的是原型鏈(Prototype Chain),也就是透過原型(Prototype)去繼承並存取其他物件的屬性~就像是上圖中的鏈條,一環扣一一環串接下去,每一個環就代表一個原型(Prototype)!
Object.create(xxx)
以xxx物件為原型(protype),複製出新的物件
白話文:複製出鍊條的下一個環XD
const human = {
action: function(){
console.log('eat')
}
}const man = Object.create(human)man.action() #=> eat
man擁有的human的屬性,因為在JS中若本身沒有的屬性,則會沿著原型鏈(Prototype Chain)向上找
__proto__
每個物件都有此屬性,表示原型鏈連到的原型物件(protype)
白話文:鍊條的上一個環XD
const human = {
action: function(){
console.log('eat')
}
}const man = Object.create(human)
const woman = Object.create(human)man.__proto__ === woman.__proto__ #=> true
protype(原型物件)
function或是語法糖衣class特有的屬性、function或class NEW 出來的物件,__proto__會=function或class的prototype,而不會是他們本身
function apple(){
console.log('🍎')
}const orange = new appleorange.__proto__ === apple.prototype #=> true
補充:
new function/class
1. 進入泡泡
2. 建立空物件 { }
3. this -> { }
4. 把 { }.__proto__ -> function 的 prototype
5. return this