簡體   English   中英

如何在類外調用超類方法?

[英]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關鍵字只能在類內部使用,而不能在外部使用。 從技術上講,可以直接調用CarprintModel方法,但應避免這種情況。 覆蓋超類(如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實例上都可以作為printGenericModelprintModel使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM