Использование свойства stati c, определенного в подклассе из суперкласса - PullRequest
0 голосов
/ 27 марта 2020

Я хочу определить свойство stati c в подклассе и получить доступ к нему в суперклассе. Это возможно?

Сообщение об ошибке гласит: model is not defined.

Я просто хочу, чтобы мой FieldsetController знал о модели Fieldset:

import Model from './../../library/Model'

class Fieldset extends Model {
  static name = 'fieldset'
  static pluralName = 'fieldsets'
}

export default Fieldset

Код выглядит как:

fieldset / controller. js:

import Controller from './../../library/controller'
import Fieldset from './model'

class FieldsetController extends Controller {
  static model = Fieldset
}

export default FieldsetController

library / controller. js:

class Controller {
  static index(request, response) {
    const data = model.getAll()
    response.render(`admin/${model.pluralName}/index`)
  }

  static create(request, response) {}

  static store(request, response) {}

  ...
}

export default Controller

1 Ответ

2 голосов
/ 27 марта 2020

Вы можете получить доступ к свойству stati c из любого места в своем коде:

const model = FieldsetController.model;

Stati c члены (свойства или метод) характеризуются тем, что они не привязаны ни к какому экземпляру учебный класс. К ним можно получить доступ без вызова new Class(), и, кроме того, к ним нельзя получить доступ через экземпляр.

ОБНОВЛЕНИЕ

Как писал @Mohammad Dehghan в комментарии, возникнет проблема круговых зависимостей, которых вы должны избегать. Поэтому лучшим подходом было бы удалить stati c модификаторы и передать модель функции super :

class FieldsetController extends Controller {
  model = Fieldset

  constructor() {
    super(this.model)
  }
}

А затем вам нужно определить ее в родительском Конструктор класса:

class Controller {
  model;
  constructor(model) {
    this.model = model;
  }

  index(request, response) {
    // here you can get model
    const data = this.model.getAll()
    response.render(`admin/${model.pluralName}/index`)
  }
}

Если вы хотите вызвать метод индекса, вам нужно инициализировать класс FieldsetController:

const controller = new FieldsetController();
controller.index();
...