Есть несколько способов сделать то, что вы хотите, и вы должны спросить себя: концептуально, как это должно работать?
Вы должны переосмыслить всю ситуацию.Суть в том, почему двигатель заботится о том, в каком автомобиле он находится?Автомобиль заботится только о том, что делает двигатель, а не наоборот.
Итак, скажем, у вас есть метод start
на транспортном средстве.Это может выглядеть как
start() {
this.engine.start().then(function(infofromengine) {
console.log('engine started', infofromengine);
}, function(errorfromengine) {
console.log('error in engine start', errorfromengine);
}
}
, и в вашем движке у вас будет тот метод start
, который возвращает обещание и любую информацию, которую транспортное средство может знать о двигателе;
выможет также, при инициализации двигателя в транспортном средстве, настроить всевозможные источники событий, и в вашем транспортном средстве зацепить излучатели.
Если сделать еще один шаг вперед, у вас могут быть некоторые дочерние компоненты, которые должны бытьчтобы быть в курсе друг друга.Таким образом, вы могли бы «подключить их» в строительстве.Пример, придуманный из этого, может быть в конструкторе вашего транспортного средства
constructor() {
this.checkEngineLight = new Light();
this.engine = new Engine({checkEngineLight});
}
и в двигателе,
constructor(config) {
let {checkEngineLight} = config;
this.engineLight = checkEngineLight;
}
someEngineAction() {
if (some_error_happens) this.engineLight.toggle(true, someerrorid);
}
, есть причина, по которой нас называют "разработчиками программного обеспечения" или "архитекторами программного обеспечения".мы не просто пишем код, мы должны рассмотреть, как код взаимодействует со всеми движущимися частями.
Но чтобы ответить на ваш вопрос более прямо, в случае, когда «движок» обязательно должен иметь прямой доступ«транспортному средству» вы должны были бы рассказать двигателю о транспортном средстве ... точно так же, как вы сказали ему о контрольной лампочке двигателя: new Engine(this)
и конструктор двигателя будет constructor(vehicle)