Singleton .
Отвечу тут Дмитрию, на хабре дискутировать неудобно.
Singleton'у может понадобиться конструктор, который желательно вызвать в момент первого использования объекта. Тогда простой объект будет использовать неудобно. Я вот здесь в конце статьи привел вариант реализации Singleton, но, честно говоря, сам им пока не пользовался :) |
Цитата:
Цитата:
Цитата:
В качестве преимущества, можно выделить хранение в контексте конструктора каких-то вспомогательных "скрытых" сущностей (которые могут быть использованы в методах объекта), но тот же результат можно получить простым созданием контекста из FE, которая уничтожится сразу после инициализации объекта. Но, в качестве теоретической имитации шаблона "Singleton" из классовой парадигмы, можно и использовать предложенный вариант, но, с практической точки зрения, я не вижу особой надобности. |
Цитата:
|
Цитата:
|
Kolyaj, там же, на Хабре, приводят преимуществом наследование, с этим - согласен.
|
Цитата:
var S = {...}; if (...) { // Здесь S нужен } else { // А здесь не нужен } Цитата:
|
Цитата:
Цитата:
if (...) { var S = {}; } else { ... } В любом случае (и в твоей реализации тоже), переменная "S" уже будет в объекте переменных. Ещё преимуществом можно выделить частые подобные проверки с if-ми-else-ами. Чтобы каждый раз не проверять, инициализирован ли уже объект (if typeof S !== 'undefined'), можно вынести его в геттер (который и называется в данном случае "Singleton"): function getOurObject() { if (!arguments.callee.instance) { arguments.callee.instance = {...}; } return arguments.callee.instance; } В общем, два преимущества: 1. Наследование (если нужно); 2. Улучшение code-reuse, чтобы сократить код (этот пункт, в данном случае, является разновидностью memoization). |
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
getPanel: function () { if (!this.panel) { // вычисления и создание панели } return this.panel; } // и потом в 10 методах // this.getPanel() Я говорил об _этом_, когда упомянул разновидность memoization. Здесь ближе по _идеологии_ именно к этой сущности, но не к Singleton. Хотя, в определении "возвращает один и тот же объект" - да, можно и терминологию "Singleton" приплести. Если же это ещё подкрепить и оператором new, то вообще ещё больше похоже (но сути не меняет). Цитата:
В этом случае, смысла в дополнительном конструкторе нет. Более того, в том же Ext-e, например, люди пишут, опять же, в Java-Swing-стиле: именно для организации наследования создают наследника от какого-то базового "класса", даже, если затем этот наследник породит всего _один_ объект. Спрашивается, зачем конструктор? Для наследования. Из-за этого приходится его плодить. Если бы можно было по стандарту (а не только через __proto__ в конкретных реализациях) менять свободно прототип, то пункт с наследованием бы отпал, конструктор был бы не нужен (как, кстати, и new). |
Цитата:
|
Цитата:
Повторю, в ответе на Хабре имелся в виду обычный объект, который однозначно будет использоваться (и в этом плане, конструктор - лишний). Более того, если уж приплетать терминологию "Синглтон", можно и этот объект назвать "Синглтоном" (а чем он отличается от того, который будет порождён альтернативным конструктором?). Но, опять повторюсь, чем можно оправдать наличие конструктора для одиночного объекта - это (1) наследование (и, как пример, я привожу идеологию ExtJS и её обёртку наследования - когда для одной панели нужно объявить "класс") и (2) - геттер для частых проверок. |
Цитата:
var S = { // много строк кода }; // А вот тут уже инициализация объектаТакой код читается хуже, чем var S = Singleton({ // <-- псевдокод init: function() { // инициализация }, // остальной код }) |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 19:55. |