Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Развитие языка javascript переносит выполнение кодов на распределенную сеть пользователей и снимает нагрузку с сервера. Это разумный подход. Введение в js ключевых слов class, extends и static дало возможность легко моделировать классами и объектами предметную область проекта. Это замечательно. Следующий вопрос, который необходимо рассмотреть при возрастании сложности js-проекта - это пространство имен. Именно оно позволяет избежать конфликтов с ворохом разнородных js-скриптов. Как показывает практика с этим вопросом почему-то возникли большие сложности. Смотри ссылки ниже:
https://stackoverflow.com/questions/881515/how-do-i-declare-a-namespace-in-javascript
https://habr.com/ru/post/527610/
https://habr.com/ru/post/31596/
https://habr.com/ru/post/527610/
https://habr.com/ru/post/528218/
Плохо. Очень сложные решения. Некоторую ясность в вопрос вносит следующая статья:
https://drbrain.ru/articles/js-namespaces/
Но и в ней мысль не доведена до логического конца. Однако чуток доработав эту статью, можно получить очень простую схему (паттерн) для работы с пространством имен:
/* namespaceOne */{
class First {
//статическое свойство
static className = "First";
constructor() {
console.log("class First consructed");
}
print() {
console.log("First print");
}
//статическая функция
static printStatic() {
console.log(First.className + " static print ");
}
}
//наследование
class Second extends First {
constructor() {
super();
Second.className = "Second";
console.log("class Second consructed");
}
//полиморфизм
print() {
console.log(Second.className + " print");
}
}
class Third {
className;
encapsulation;
constructor() {
this.className = "Third";
this.encapsulation = new Second(); //инкапсуляция
console.log("class Third consructed");
}
print() {
console.log("Third print");
}
}
//экспорт пространства имен
var namespaceOne = {First: First, Second: Second, Third: Third};
}
/* namespaceTwo */{
//импорт пространства имен
namespaceOne.First.printStatic();
let second = new namespaceOne.Second();
second.print();
let ThirdClass = namespaceOne.Third;
let third = new ThirdClass();
third.print();
}
Есть такое чувство, что ключевые слова import, export - для такой схемы будут лишь синтаксическим сахаром. Теперь вы можете смело добавлять свой код в любой проект просто взяв его {в фигурные скобки}. С большой вероятностью конфликтов у вас не возникнет.