[英]How to call a super class method outside a class?
我有一個BMW類,它擴展了Car類並覆蓋了printModel方法:
class Car{ constructor(model){ this.model = model } printModel(){ console.log(this.model) } } class BMW extends Car{ constructor(model, color){ super(model); this.color = color } printModel(){ console.log(this.model, this.color) } } let bmw = new BMW('F6', 'blue') bmw.printModel() //will print : 'F6 blue' bmw.super.printModel()// expected: 'F6' but not working
如何在此BMW類的實例上調用類的超級方法?
您需要一種方法來最終在實例化上調用某些東西時達到super
。 一種選擇是在BMW
上定義另一種調用super.printModel
:
class Car { constructor(model) { this.model = model } printModel() { console.log(this.model) } } class BMW extends Car { constructor(model, color) { super(model); this.color = color } printModelBMW() { console.log(this.model, this.color) } printModelCar() { super.printModel(); } } let bmw = new BMW('F6', 'blue') bmw.printModelBMW() //will print : 'F6 blue' bmw.printModelCar() // expected: 'F6'
在類的上下文之外無法引用超級實例。 如果確實必須從類外部使用超級實例中的方法,則可以自己調用該方法:
Car.prototype.printModel.call(bmw);
super
關鍵字只能在類內部使用,而不能在外部使用。 從技術上講,可以直接調用Car
的printModel
方法,但應避免這種情況。 覆蓋超類(如printModel
)中的方法的全部printModel
是為它提供一個更適合於子類的實現。 因此,規避這表明OO設計不正確。
但是,出於教育目的,我認為了解如何在技術上進行仍然很有用,因為它揭示了JS類實際上仍在使用原型的情況:
Car.prototype.printModel.call(bmw)
避免這種情況的一種改進設計的方法是添加一個可選參數,以指定要如何打印模型:
class BMW extends Car{
constructor(model, color){
super(model)
this.color = color
}
printModel(includeColor){
if (includeColor) {
console.log(this.model, this.color)
}
else super.printModel()
}
}
class Car{
constructor(model){
this.model = model
}
printModel(){
console.log(this.model)
}
getModel()
{
return this.model
}
}
class BMW extends Car{
constructor(model, color){
super(model);
this.color = color
}
printModel(){
console.log(super.getModel(), this.color)
}
}
如果需要將父類方法與子類方法一起使用,則意味着類設計出錯,覆蓋父方法是一個錯誤。
它可能是:
class Car{
...
printGenericModel(){
console.log(this.model)
}
}
class BMW extends Car{
...
printModel(){
console.log(this.model, this.color)
}
}
或者如果父類無法重構:
class Car{
...
printModel(){
console.log(this.model)
}
}
class BMW extends Car{
...
get printGenericModel(){
return super.printModel;
}
printModel(){
console.log(this.model, this.color)
}
}
這兩種方法在BMW
實例上都可以作為printGenericModel
和printModel
使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.