Pull to refresh

JsOOP

Reading time4 min
Views847
В статье речь пойдет об имитации классического ООП и строгой типизации в JavaScript (< 2.0).

Я расскажу про JsOOP – мини-фреймворк для написания JavaScript-кода в объектно-ориентированном стиле.

Начнем с ООП. Существует множество вариантов ввести понятие класса в JavaScript. Не буду их все перечислять, сразу предлагаю перейти к определению класса с использованием JsOOP:

var Zoo = Zoo || {};

Zoo.Animal = Class
({
    construct: function(name)
    {
        this._name = name;
    },

    methods:
    {
        Scream: null,

        SayName: function()
        {
            document.write(Zoo.Animal.QuoteName(this._name));
        }
    },

    statics:
    {
        QuoteName: function(name)
        {
            return "{ " + name + " }";
        }
    }
})


* This source code was highlighted with Source Code Highlighter.

Сначала определяется пространство имен (namespace) Zoo. Затем класс Animal внутри него:
construct – это функция-конструктор, methods – набор instance-методов (Scream – абстрактный метод), statics – набор статических методов.

Стоит оговориться, что поддержки полноценных закрытых и защищенных (private и protected) полей и методов класса в JsOOP нет. Поэтому вводится рекомендация начинать имена таких переменных и функций со знака подчеркивания.

Теперь определим производный класс:

Zoo.Dog = Class
({
    base: Zoo.Animal,

    construct: function(name, bark, loudness)
    {
        this.$base()(name);
        this._bark = bark;
        this._loudness = loudness;
    },

    methods:
    {
        Scream: function()
        {
            var s = "";
            for (var i = 0; i < this._loudness; i++)
            {
                s += this._bark;
            }
            document.write(s);
        },

        SayName: function()
        {
            document.write(this._bark + " ");
            this.$base('SayName')();
        }
    }
})


* This source code was highlighted with Source Code Highlighter.

Обратите внимание на способ вызова конструктора и метода базового класса из производного.

Простой пример использования класса:

var bob = new Zoo.Dog("Bob", "Woof!", 3);

bob.SayName(); // выводит "Woof!Woof! { Bob }"
bob.Scream(); // выводит "Woof!Woof!Woof!"


* This source code was highlighted with Source Code Highlighter.

Опционально, в описание любого класса можно добавить секцию vars. Например, для класса Dog:

Zoo.Dog = Class
({
    // ...

    vars:
    {
        _bark: Type.String,
        _loudness: Type.Number
    }

    // ...
})


* This source code was highlighted with Source Code Highlighter.

В пространстве имен Type определены всевозможные типы переменных. На самом деле это предикаты, например:

Type.String = function(v)
{
    return typeof (v) == "string";
}


* This source code was highlighted with Source Code Highlighter.

Всегда можно расширить этот список, например, типом Type.Interface, принимающим в качестве параметра массив имен методов, которые должен поддерживать объект переменной. То есть, чтобы описание поля класса выглядело вот так:

vars:
{
    _animal: Type.Interface(['SayName', 'Scream'])
}


* This source code was highlighted with Source Code Highlighter.

Скачать JsOOP можно тут. Содержимое:

oo_debug.js – поддерживает описания классов в рассмотренном стиле (функция Class) и осуществляет проверку типов переменных из vars-секции перед и после выполнения кода любого метода класса.

oo.js – тоже самое, что предыдущий сприпт, только проверки типов не происходит. Секция vars игнорируется.

types.js – описания типов-предикатов.

Tags:
Hubs:
Total votes 40: ↑31 and ↓9+22
Comments145

Articles