Удобный синтаксис для OOP в JavaScript

в 18:44, , рубрики: javascript, Веб-разработка, ооп, метки: ,

Несмотря на то, что в 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js