dom1n1k
@dom1n1k

Можно ли в ES6 объединить классы в пространства имён?

Мне очень нравится архитектура и организация библиотеки Leaflet. Она включает в себя очень много сущностей (карты, слои, маркеры, балуны, векторные элементы и так далее). Но всё это сидит в общем объекте, который играет роль пространства имен. Очень понятно, наглядно, удобно.
L.Map
L.TileLayer
L.Marker

Как сделать в ES6 так же или нечто наподобии? Чтобы можно было потом писать:
var a = new MyLib.Dedka();
var b = new MyLib.Babka();
var c = new MyLib.Repka();

Просто классы Dedka и Repka, которые непонятно как и к чему относятся - это как-то не очень. Имена типа MyLibDedka - тоже не фонтан.
  • Вопрос задан
  • 331 просмотр
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Но всё это сидит в общем объекте, который играет роль пространства имен. Очень понятно, наглядно, удобно.


И делают так потому что модулей нет. В ES6 модули есть и нет смысла более делать подобные кастыли. Сравните:

import L from 'leaflet';

var m = new L.Map();

// и
import {Map} from 'leaflet';

var m = new Map();


в целом вам никто не запрещает так делать. Как никак это все всего-лишь обертка над Object.create и старыми добрыми конструкторами.
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
А что мешает сделать вот так?
// MyLib.js
export class Dedka {}
export class Repka extends Dedka {}

// клиентский код
import MyLib from './lib/MyLib';

const a = new MyLib.Dedka();
const c = new MyLib.Repka();


Другое дело, что смысла в этом, при возможности написать
import {Dedka, Koshka as Zhoochka} from './lib/MyLib';
ни на грош. Сергей Протько абсолютно прав, все эти псевдо-«пространства имен» исключительно от отсутствия нормальной модульной системы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы