1.this和super的區別:
-
this關鍵詞指向函數所在的當前對象
-
super指向的是當前對象的原型對象
2.super的簡單應用
const person = { name:'jack' } const man = { sayName(){ return super.name; } } Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //jack
3.super的另類實現
super.name 等同於 Object.getPrototypeOf(this).name【屬性】 等同於 Object.getPrototypeOf(this).name.call(this)【方法】
4.super中的this指向(易混淆)
super.name指向的是原型對象person 中的name,但是綁定的this還是當前的man對象。
const person = { age:'20多了', name(){ return this.age; } } const man = { age:'18歲了', sayName(){ return super.name(); } } Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //18歲了
Object.getPrototypeOf(this).name指向的是person的name,綁定的this也是person
const person = { age:'20多了', name(){ return this.age; } } const man = { age:'18歲了', sayName(){ return Object.getPrototypeOf(this).name(); } } Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //20多了
Object.getPrototypeOf(this).name.call(this)指向的是person的name,不過通過call改變了函數的執行上下文,所以this指向的還是man
const person = { age:'20多了', name(){ return this.age; } } const man = { age:'18歲了', sayName(){ return Object.getPrototypeOf(this).name.call(this) } } Object.setPrototypeOf( man, person ); let n = man.sayName(); console.log( n ) //18歲了