Как вызвать метод суперкласса вне класса? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть класс 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

Как вызвать метод super класса на экземпляре этого класса BMW?

Ответы [ 5 ]

0 голосов
/ 29 сентября 2018

Если метод родительского класса необходимо использовать вместе с методом дочернего класса, это означает, что дизайн класса был неправильным, переопределение родительского метода было ошибкой.

Это может быть:

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)
    }
}

Оба метода доступны как printGenericModel и printModel для BMW экземпляра.

0 голосов
/ 29 сентября 2018
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)
     }
}
0 голосов
/ 29 сентября 2018

Ключевое слово super можно использовать только внутри класса, но не снаружи.Технически возможно вызвать метод Car printModel напрямую, но этого действительно следует избегать.Весь смысл переопределения метода в суперклассе (например, printModel) состоит в том, чтобы дать ему реализацию, более подходящую для подкласса.Таким образом, обход этого признака является неправильным дизайном ОО.

Однако для образовательных целей я считаю, что было бы полезно узнать, как это можно технически сделать, поскольку оно показывает, как классы 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()
    }
}
0 голосов
/ 29 сентября 2018

Невозможно ссылаться на супер экземпляр вне контекста класса.Если вы действительно должны использовать метод из суперэкземпляра вне класса, вы можете вызвать метод самостоятельно:

Car.prototype.printModel.call(bmw);
0 голосов
/ 29 сентября 2018

Вам понадобится способ в конечном итоге добраться до 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...