В статье речь пойдет об имитации классического ООП и строгой типизации в JavaScript (< 2.0).
Я расскажу про JsOOP – мини-фреймворк для написания JavaScript-кода в объектно-ориентированном стиле.
Начнем с ООП. Существует множество вариантов ввести понятие класса в JavaScript. Не буду их все перечислять, сразу предлагаю перейти к определению класса с использованием JsOOP:
Сначала определяется пространство имен (namespace) Zoo. Затем класс Animal внутри него:
construct – это функция-конструктор, methods – набор instance-методов (Scream – абстрактный метод), statics – набор статических методов.
Стоит оговориться, что поддержки полноценных закрытых и защищенных (private и protected) полей и методов класса в JsOOP нет. Поэтому вводится рекомендация начинать имена таких переменных и функций со знака подчеркивания.
Теперь определим производный класс:
Обратите внимание на способ вызова конструктора и метода базового класса из производного.
Простой пример использования класса:
Опционально, в описание любого класса можно добавить секцию vars. Например, для класса Dog:
В пространстве имен Type определены всевозможные типы переменных. На самом деле это предикаты, например:
Всегда можно расширить этот список, например, типом Type.Interface, принимающим в качестве параметра массив имен методов, которые должен поддерживать объект переменной. То есть, чтобы описание поля класса выглядело вот так:
Скачать JsOOP можно тут. Содержимое:
oo_debug.js – поддерживает описания классов в рассмотренном стиле (функция Class) и осуществляет проверку типов переменных из vars-секции перед и после выполнения кода любого метода класса.
oo.js – тоже самое, что предыдущий сприпт, только проверки типов не происходит. Секция vars игнорируется.
types.js – описания типов-предикатов.
Я расскажу про 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 – описания типов-предикатов.