class Dog {
constructor(name, color) {
this.name = name
this.color = color
//嘴
this.mouth = {
bite: function (something) {
//咬
console.log(`咬${something}`)
},
eat: function (something) {
//吃
console.log(`吃${something}`)
},
spark: function () {
//吠叫
console.log(`吠叫`)
}
}
}
spark() {
//實作細節,從喉嚨發出聲音
this.mouth.spark()
}
bite(someone) {
//實作細節,要用嘴去咬東西
const name = getName(someone)
this.mouth.bite(name)
}
eat(thing) {
const name = getName(thing)
this.mouth.eat(name)
}
}
//不想被暴露的功能
const getName = function objectOrName(thing) {
//錯誤處理
let name = ''
if (typeof thing === 'object' && thing.name)
name = thing.name
else if (typeof thing === 'string')
name = thing
else name = ''
return name
}
dog.eat(catty)//輸出 吃凱蒂
//定義父類建構函數,它接收兩個參數 name 和 age
//函數初始化了三個屬性:name、age 和一個方法 methodFunc
function Parent(name, age) {
this.name = name
this.age = age
this.methodFunc = function () {
console.log(name, age)
}
}
//定義子類建構函數
//它接收一個參數 price,並將其賦值給 this.price。
function Child(price) {
this.price = price
}
//設定子類的原型
//Child.prototype 現在是一個 Parent 物件。
//結果是,所有 Child 的實例都會繼承 Parent 實例的屬性和方法。
Child.prototype = new Parent("孩子", 18)
//創建 Child 的實例
const c = new Child (4000)
//輸出結果
c.price //輸出4000
c.age //輸出18
c.methodFunc() //輸出孩子 18
super()
必須在 constructor 中的第一個語句。因為 super()
是用來初始化父類的建構函數。this
關鍵字的任何使用必須在 super()
之後。因為在 JavaScript 中,只有在父類構造完成後,子類的實例才被認為是完整的,才能正常使用 this。super()
只能在 constructor 中調用。但可以使用 super.methodName() 來調用父類的方法。使用 super
調用父類的建構函數是為了在子類中正確地初始化從父類繼承過來的屬性和行為。
class Parent {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
class Child extends Parent {
constructor(price, name, age) {
super(name, age); // 調用 Parent 的建構函數,初始化 name 和 age
this.price = price; // 初始化 Child 自己的屬性
}
}
const c = new Child(4000, "孩子", 18);
console.log(c.name); // 輸出:孩子
console.log(c.age); // 輸出:18
console.log(c.price); // 輸出:4000
當重寫父類的方法時,可以在子類中調用父類的方法,這樣可以在增加或修改功能時,保留原本的功能。
class Parent {
constructor(name, age) {
this.name = name
this.age = age
}
methodFunc() {
console.log("這是parent", this.name, this.age)
}
static staticMethods() {
console.log("這是parent")
}
}
class Child extends Parent {
constructor(price, name, age) {
super(name, age)//代表parent的建構函數
this.price = price
}
static staticMethods() {
super.staticMethods()
console.log("這是children")
}
methodFunc() {
super.methodFunc()
console.log("這是children", this.name, this.age)
}
}
const c = new Child(4000, "孩子", 18)
c.methodFunc()//輸出這是parent 孩子 18和這是children 孩子 18