JSFiddle - React, Tailwind, and code Playground

https://jsfiddle.net/Launder/40nqak6j/21/#run

by Alexey Lisovy

JavaScript

/* Экспериментируем с модулем
   
придумать функцию добавления, в которой важен контекст исполнения... - а смысл? всё равно контекст можно добавить...
   
   нужно расписать зоны видимости
   можно также потестировать "разные запуски - разные зоны видимости"
   и, конечно, несколько методов, в массиве с аргументами-методами
   
   Итак выяснили, что когда мы действуем через Object.defineProperty то у get/set свойства writable нет, а остальные - в значении false. Это значит, что не удалишь/не поменяешь. Чтоб можно было - нужно при объявлении вручную прописать для них true 
   Нужно как-то запаролть геттеры, чтоб они не перезаписались (то есть сделать "ещё один слой" или модифицировать имеющийся...)
*/

var MyModules = (function Manager()
															{
																	var modules = { }; //объект - хранилище методов

																	function define(name, deps, impl) // имя нового метода, уже добавленные методы, нужные для формирования текущего, функция добавления нового метода
                                  		{
																					 for (var i = 0; i < deps.length; i++)
                                           		 {
                                                    deps[i] = modules[ deps[i] ]; // меняем названия методов на сами методы
                                               }
                                               
																					 modules[name] = impl.apply( impl, deps );
    //impl - функция, которая добавляет метод, по необходимости, используя другие (уже существующие в объекте)методы, в качестве аргументов
																			}
//добавляем функции, которые добавим "внешнему" объекту, в виде методов, для работы с "внутеренним объектом"
																	function get(name) {  return modules[name];  }
                                  function del(name) {  delete modules[name];  }
                                  function methods() 
                                                     {
																										     var str = '';
   ...