Замыкания против классов для инкапсуляции?

Я новичок в JS (из C ++ / и т. Д.), И мне пришло в голову, что замыкания кажутся более простым и удобным способом обработки инкапсуляции, чем классы . Этот код, кажется, дает простой способ обработки инкапсуляции:

function addProperty(o) {
   var value;

   o["get"] = function()  { return value; }
   o["set"] = function(v) { value = v; }
}

// create two independent objects which are instances of pseudo-class 'addProperty',
// which each have their own version of a set of local fields, and methods that
// operate on those fields:
var a = {};
addProperty(a);
var b = {};
addProperty(b);

Если вы просто хотите, чтобы класс обрабатывал инкапсуляцию (в C ++, я считаю, что это большую часть времени), есть ли веская причина использовать класс JS вместо закрытие? Приведенный выше код кажется мне более интуитивным и компактным, чем классы JS. Никаких конструкторов, прототипов или чрезмерного использования слова this. Вы также получаете преимущество, заключающееся в том, что вы должны явно объявлять локальные поля вместо того, чтобы надеяться, что вы не сделаете никаких опечаток в своем конструкторе.

РЕДАКТИРОВАТЬ

Хорошо, я просто поясню. Похоже, слово «класс» находит поддержку. «Класс» для меня в любом случае является расширением концепции типа, и JS не подходит для этого, но я могу делать различные классные вещи, используя то, что моя книга (Фланаган) тратит на 50 страниц, вызывая классы. Вроде, как бы, что-то вроде.

В любом случае, реальный вопрос заключается в следующем: я использую вкладки jQuery в своем первом веб-приложении. Вчера я заметил, что это не работает, потому что мой JS-код не сохраняет приватное состояние для каждой вкладки. Когда я переключаюсь между вкладками, динамические части моего кода / мыши перестают работать должным образом.

Итак, как лучше всего добавить частное состояние в приложение? Большая часть кода безопасна, но все, что обрабатывает динамическое поведение, требует некоторого способа инкапсулировать локальное состояние каждой вкладки. Имея опыт работы на C ++, очевидный ответ для меня - написать класс, определяющий динамические части вкладки, и создавать экземпляр нового объекта «вкладка» каждый раз при создании вкладки. Что мне трудно понять, так это то, имеют ли здесь псевдоклассы JS какой-то смысл, или мне следует расширить приведенный выше код.

Просто прочтите ссылку на шаблоны модулей от Джонатана, и теперь мне кажется, что это может быть ответ.

Спасибо.

22
задан EML 4 January 2012 в 18:24
поделиться