Родительский статический метод для возврата объекта подкласса

class Vehicle {
    constructor (name, type) {
        this.name = name;
        this.type = type;

        console.log(this.constructor.name);
    }
    getName () {
        return this.name;
    }
    getType () {
        return this.type;
    }
    static create(name, type) {
        return new Vehicle(name, type);
    }
}

class Car extends Vehicle {
    constructor (name) {
        super(name, 'car');
    }
    getName () {
        return 'It is a car: ' + super.getName();
    }
}

let car = Car.create('Tesla', 'car');
console.log(car.getName()); // It is a car: Tesla
console.log(car.getType()); // car

В приведенном выше коде используется ключевое слово class ES6 для определения класса Vehicle и его подкласса Car. Как вернуть экземпляр Car из статического метода Vehicle.


person Sami ur Rahman Qazi    schedule 04.02.2018    source источник


Ответы (2)


Пытаться:

let car = new Car('Tesla')
person Arman Charan    schedule 04.02.2018

Вы можете передать ClassName, который хотите использовать, в своей статической функции create и создать из нее экземпляр.

static create(name, type, objClass) {
    return new Function(`return new ${objClass ? objClass : 'Vehicle'}('${name}', '${type}');`)();
}

Класс Function получает строку с выражением для оценки в вашем случае:

new Function(`return new ${objClass}('${name}', '${type}');`)()

Посмотрите на этот код

class Vehicle {
  constructor(name, type) {
    this.name = name;
    this.type = type;
  }
  getName() {
    return this.name;
  }
  getType() {
    return this.type;
  }
  static create(name, type, objClass) {
    return new Function(`return new ${objClass ? objClass : 'Vehicle'}('${name}', '${type}');`)();
  }
}

class Car extends Vehicle {
  constructor(name) {
    super(name, 'car');
  }

  getName() {
    return 'It is a car: ' + super.getName();
  }
}

let car = Car.create('Tesla', 'car', 'Car');
console.log(car.getName()); // It is a car: Tesla
console.log(car.getType()); // car

let superCar = Vehicle.create('Tesla', 'car');
console.log(superCar.getName()); // Tesla
console.log(superCar.getType()); // car
.as-console-wrapper {
  max-height: 100% !important
}

Видеть? теперь печатает правильный вывод.

Ресурсы

person Ele    schedule 04.02.2018