記錄下class中的原型,實(shí)例,super之間的關(guān)系
創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站與策劃設(shè)計(jì),商城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:商城等地區(qū)。商城做網(wǎng)站價(jià)格咨詢(xún):13518219792
//父類(lèi)
class Dad {
constructor(x, y) {
this.x = 5;
this.y = 1;
this.state = 789
}
static x = 521
state1 = 666
say() {
console.log("父類(lèi)bark");
}
talk = () => {
console.log("父類(lèi)talk");
}
static speak() {
console.log("父類(lèi)speak");
console.log(this.state);
}
speak(){
console.log("父類(lèi)不會(huì)speak");
}
}
//子類(lèi)
class Child extends Dad {
constructor() {
super()
this.x = 987
this.toString = this.toString.bind(this)
}
state = {}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
toString1 = () => {
return '(' + this.x + ', ' + this.y + ')';
}
say = () => {
super.say();
console.log("子類(lèi)bark");
console.log(super.x);
}
talk = () => {
super.talk()
console.log("子類(lèi)talk");
}
static speak() {
super.speak()
console.log("子類(lèi)speak");
console.log(super.x);
}
}
console.log(new Child().x); // 輸出987
console.log(new Child().y); // 輸出1
new Child().say(); // 輸出 父類(lèi)bark 子類(lèi)bark undefined
new Child().talk(); // 報(bào)錯(cuò) super.talk is not a function
Child.speak(); // 父類(lèi)speak undefined 子類(lèi)speak 521
構(gòu)造器中的this指向?qū)嵗龑?duì)象,在構(gòu)造函數(shù)上定義的屬性和方法相當(dāng)于定義在類(lèi)實(shí)例上的,而不是原型對(duì)象上
子類(lèi)的toString方法是掛載到原型上的,toString1是掛載到每個(gè)實(shí)例上的
this.toString.bind(this),前面的this是不確定的,取決于調(diào)用方式;
后面的this指實(shí)例對(duì)象,這行代碼目的是為了固定toString方法的this為實(shí)例對(duì)象,避免函數(shù)賦值給變量時(shí)this丟失
super關(guān)鍵字用于訪(fǎng)問(wèn)和調(diào)用一個(gè)對(duì)象的父對(duì)象上的函數(shù)。
super作為函數(shù)使用,調(diào)用的是父類(lèi)的構(gòu)造函數(shù),而其中的this指向子類(lèi)自己(用父類(lèi)的方法操作自己的東西)
super 作為對(duì)象時(shí),在普通方法中,指向父類(lèi)的原型對(duì)象(只能訪(fǎng)問(wèn)原型上的函數(shù),無(wú)法訪(fǎng)問(wèn)屬性);在靜態(tài)方法中,指向父類(lèi)本身(調(diào)用的是父類(lèi)的靜態(tài)方法或?qū)傩裕?,但是this指向子類(lèi)。