我們知道,this關(guān)鍵字總是指向函數(shù)所在的當(dāng)前對象遥赚,ES6 又新增了另一個類似的關(guān)鍵字super羽莺,指向當(dāng)前對象的原型對象
const proto = {
foo: 'hello'
};
const obj = {
foo: 'world',
find() {
return super.foo;
}
};
Object.setPrototypeOf(obj, proto);
obj.find() // "hello"
上面代碼中捞慌,對象obj.find()方法之中,通過super.foo引用了原型對象proto的foo屬性铡恕。
注意,super關(guān)鍵字表示原型對象時,只能用在對象的方法之中问慎,用在其他地方都會報錯。
// 報錯
const obj = {
foo: super.foo
}
// 報錯
const obj = {
foo: () => super.foo
}
// 報錯
const obj = {
foo: function () {
return super.foo
}
}
上面三種super的用法都會報錯挤茄,因為對于 JavaScript 引擎來說如叼,這里的super都沒有用在對象的方法之中。第一種寫法是super用在屬性里面穷劈,第二種和第三種寫法是super用在一個函數(shù)里面笼恰,然后賦值給foo屬性。目前歇终,只有對象方法的簡寫法可以讓 JavaScript 引擎確認社证,定義的是對象的方法。
JavaScript 引擎內(nèi)部评凝,super.foo等同于Object.getPrototypeOf(this).foo(屬性)或Object.getPrototypeOf(this).foo.call(this)(方法)追葡。
const proto = {
x: 'hello',
foo() {
console.log(this.x);
},
};
const obj = {
x: 'world',
foo() {
super.foo();
}
}
Object.setPrototypeOf(obj, proto);
obj.foo() // "world"
上面代碼中,super.foo指向原型對象proto的foo方法,但是綁定的this卻還是當(dāng)前對象obj宜肉,因此輸出的就是world匀钧。