Как грамотно организовать JS код в ООП стиле разнесенный по файлам? Не могу до конца понять структуру того, как должен действовать ООП код, чтобы получать доступ к родительским свойствам конструктора. При этом не ясно, где создавать и вызывать объекты. Допустим у меня есть два класса, это `app` - мой главный класс, `map` - класс с картой, который дочерний класса `app` Я имею следующий код класса `app`class App { constructor() { this.app = document.querySelector('#city'); } init() { } } const app = new App(); app.init(); export default function () { return App; } Отсюда я экспортирую весь класс целиком, чтобы получить доступ к его конструктору в другом файле. Код представлен нижеimport App from '../index.js'; //забираю мой класс class Map extends App { constructor() { super(); console.log(this.app); //здесь почему то приходит undefined?? }
// ... my metods } Вопрос в том почему `undefined`? И второй вопрос, где нужно создавать объект от класса `map`. То есть мне нужно эскпортировать класс и в родительском потом создавать объект, и обращаться к методам? или как-то по-другому? При этом нужно учесть что у класса `map` будут тоже подклассы. Я буду очень благодарен, если кто-то скинет пример. Или хотя бы ссылочку на грамотно организованный код, чтобы посмотреть.
Давайте разберем ваш код и внесем необходимые изменения для корректной работы согласно принципам ООП.
В классе App у вас сейчас неправильное использование super() в конструкторе класса Map. Правильный способ вызова конструктора родительского класса с использованием super() выглядит так:super();В классе App у вас нужно создать объект класса Map и вызвать методы этого объекта из метода init(). Таким образом, у вас должно получиться что-то вроде:import Map from './Map.js'; //подключаем класс Map class App { constructor() { this.app = document.querySelector('#city'); this.map = new Map(); // создаем объект класса Map } init() { this.map.someMethod(); // вызываем метод класса Map } } const app = new App(); app.init(); export default App;В классе Map у вас также нужно правильно передавать параметры родительского класса через super(). Также, следует создать объекты подклассов внутри конструктора класса Map, если это необходимо.import App from './App.js'; class Map extends App { constructor() { super(); console.log(this.app); // здесь должен быть корректный доступ к свойству родительского класса this.subMap = new SubMap(); // создаем объект подкласса } someMethod() { // ... код метода } } export default Map;
Таким образом, у вас должна получиться правильная организация классов с учетом наследования и вызовов методов. Надеюсь, это поможет вам разобраться с ООП структурой вашего кода. Если у вас остались вопросы - обращайтесь!
Давайте разберем ваш код и внесем необходимые изменения для корректной работы согласно принципам ООП.
В классе App у вас сейчас неправильное использование super() в конструкторе класса Map. Правильный способ вызова конструктора родительского класса с использованием super() выглядит так:super();В классе App у вас нужно создать объект класса Map и вызвать методы этого объекта из метода init(). Таким образом, у вас должно получиться что-то вроде:import Map from './Map.js'; //подключаем класс Mapclass App {
constructor() {
this.app = document.querySelector('#city');
this.map = new Map(); // создаем объект класса Map
}
init() {
this.map.someMethod(); // вызываем метод класса Map
}
}
const app = new App();
app.init();
export default App;В классе Map у вас также нужно правильно передавать параметры родительского класса через super(). Также, следует создать объекты подклассов внутри конструктора класса Map, если это необходимо.import App from './App.js';
class Map extends App {
constructor() {
super();
console.log(this.app); // здесь должен быть корректный доступ к свойству родительского класса
this.subMap = new SubMap(); // создаем объект подкласса
}
someMethod() {
// ... код метода
}
}
export default Map;
Таким образом, у вас должна получиться правильная организация классов с учетом наследования и вызовов методов. Надеюсь, это поможет вам разобраться с ООП структурой вашего кода. Если у вас остались вопросы - обращайтесь!