Несмотря на то, что в JavaScript нет встроенной работы с классами или пространствами имен, для JavaScript есть разные библиотекеи, восполняющие эти проблелы, позволяющие писать в таком стиле:
var MyClass = new Class({
myMethod: function() { }
});
var MyNamespace = {
myFunction : function() { return 10; }
}
MyNamespace.myFunction();
Однако такой подход имеет ряд недостатков:
- Невозможно «ссылаться» на элемент тогоже уровня, например при наследовании классов в одном пакете, т.к. инициализация «пакетного» объекта во время конструирования класса еще не произошла и класс, от которого хочется отнаследоваться, недоступен
- Неудобно описывать «приватные» функции и переменные — их приходится выносить за объявление пространства имен/класса, что затрудняет чтение кода
Для того, чтобы побороть оба этих недостатка, я построил библиотеку-обертку вокруг MooTools, реализующую маленький «встраевыемый язык» для описания классов/пространств имен следующим образом:
namespace('my.namespace', function() {
function myPrivateOutputFunction(text) {
console.log(text);
}
var myPrivateVariable = 'Hello ';
fun('test', function(name) {
myPrivateOutputFunction(myPrivateVariable + name);
});
});
namespace('my', function() {
namespace('namespace', function() {
clazz('MyInternalClazz', function() {
fun('test', function() {
my.namespace.test('new syntax for OOP!');
});
static_fun('test2', function() {
my.namespace.test('Static function');
});
});
});
});
var instance = new my.namespace.MyInternalClazz;
instance.test();
my.namespace.MyInternalClazz.test2();
Как видно из кода, библиотека позволяет использовать составные имена для пространств имен через точку как альтернативу вложению определений пространства имен. Описания пространств имен с одинаковымм полными именами «объединяются».
Библиотеку выложил на GitHub. Никаких особых нанотехнологий в ней нет (<100 строк), просто я нигде не видел такого способа описания пакетов/классов, который мне кажется удобным, потому и решил поделиться с сообществом.
Библиотеку тривиально научить работать с реализациями ООП отличными от MooTools слегка модифицировав метод build в «классе» _ClassDecl. Да и вообще, ее можно использовать безо всякого ООП просто из-за реализации пространств имен.
Автор: meta4