Интересно, что объектно-ориентированный стиль программирования на основе прототипа javascript интересен, но есть много ситуаций, когда вам нужна возможность создавать объекты из класса.
Например, в приложении для векторного рисования рабочая область обычно будет пуста в начале чертежа: я не могу создать новую "строку" из существующей. В более общем плане, каждая ситуация, когда объекты динамически создаются, требует использования классов.
Я прочитал много учебников и книгу "Javascript: хорошие части", но мне кажется, что нет способа определить классы, которые уважают 1) инкапсуляцию и 2) эффективное объявление методов участников (I mean: методы-члены, которые определяются один раз и распределяются между каждым экземпляром класса).
Чтобы определить частные переменные, используются замыкания:
function ClassA()
{
var value = 1;
this.getValue = function()
{
return value;
}
}
Проблема в том, что каждый экземпляр класса ClassA будет иметь свою собственную копию функции-члена getValue, которая неэффективна.
Для эффективного определения функций-членов используется прототип:
function ClassB()
{
this.value = 1;
}
ClassB.prototype.getValue = function()
{
return this.value;
}
Проблема здесь в том, что переменная "значение" члена является общедоступной.
Я не думаю, что эта проблема может быть решена легко, так как переменные "private" должны быть определены ВО ВРЕМЯ создания объекта (чтобы объект мог иметь доступ к контексту его создания, не выставляя значения thoses), тогда как прототип- определение членских функций на основе должно выполняться ПОСЛЕ создания объекта, чтобы прототип имел смысл ( "this.prototype" не существует, я проверил).
Или я что-то не хватает?
EDIT:
Прежде всего, спасибо за ваши интересные ответы.
Я просто хотел добавить небольшую точность к моему первоначальному сообщению:
То, что я действительно хочу сделать, состоит в том, чтобы иметь 1) частные переменные (инкапсуляция хороша, потому что люди имеют доступ только к тем, что им нужно) и 2) эффективное объявление методов участников (избегать копий).
Кажется, что простое объявление частных переменных действительно может быть достигнуто только путем закрытия в javascript, что, по сути, я сосредоточился на подходе, основанном на классе. Если есть способ достичь простого объявления частных переменных с помощью прототипа, который подходит для меня, я не являюсь ожесточенным подходным подходом к классу.
После прочтения ответов кажется, что простое решение - забыть о рядовых и использовать специальные соглашения о кодировании, чтобы отключить другие программисты от непосредственного доступа к переменным "private"...
И я согласен, мой заголовок/первое предложение вводит в заблуждение относительно вопроса, который я хотел обсудить здесь.