06.10.2009, 14:39
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Singleton .
Отвечу тут Дмитрию, на хабре дискутировать неудобно.
Singleton'у может понадобиться конструктор, который желательно вызвать в момент первого использования объекта. Тогда простой объект будет использовать неудобно.
Я вот здесь в конце статьи привел вариант реализации Singleton, но, честно говоря, сам им пока не пользовался
|
|
06.10.2009, 15:18
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от Kolyaj
|
Отвечу тут Дмитрию
|
Сообщение от Kolyaj
|
Я вот здесь в конце статьи привел вариант реализации Singleton
|
Да, спасибо, я уже читал эту статью.
Сообщение от alljs.ru
|
Особенность этого метода заключается еще и в том, что если экземпляр класса не понадобится, то не создается не только экземпляр, но и сам класс. При этом ключевое слово new становится вовсе опциональным, главное скобочки не забыть.
|
На самом деле, если экземпляр не понадобится, то мы и не создадим этот объект. В твоём варианте, если экземпляр понадобится, будет создан и объект, и конструктор.
В качестве преимущества, можно выделить хранение в контексте конструктора каких-то вспомогательных "скрытых" сущностей (которые могут быть использованы в методах объекта), но тот же результат можно получить простым созданием контекста из FE, которая уничтожится сразу после инициализации объекта.
Но, в качестве теоретической имитации шаблона "Singleton" из классовой парадигмы, можно и использовать предложенный вариант, но, с практической точки зрения, я не вижу особой надобности.
|
|
06.10.2009, 15:45
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Dmitry A. Soshnikov
|
На самом деле, если экземпляр не понадобится, то мы и не создадим этот объект.
|
В обычном варианте var S = {} он создастся в любом случае.
|
|
06.10.2009, 16:02
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от Kolyaj
|
В обычном варианте var S = {} он создастся в любом случае.
|
Да, и это означает, что он нужен. Если не нужен - не создаётся (т.е. его нет в коде).
|
|
06.10.2009, 17:28
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Kolyaj, там же, на Хабре, приводят преимуществом наследование, с этим - согласен.
|
|
06.10.2009, 18:05
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Dmitry A. Soshnikov
|
Если не нужен - не создаётся (т.е. его нет в коде).
|
var S = {...};
if (...) {
// Здесь S нужен
} else {
// А здесь не нужен
}
Сообщение от Dmitry A. Soshnikov
|
приводят преимуществом наследование
|
В моем варианте с наследованием туго
|
|
06.10.2009, 18:25
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от Kolyaj
|
// Здесь S нужен
|
Сообщение от Kolyaj
|
// А здесь не нужен
|
Ну, всё правильно (даже, если динамически, по условию):
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).
|
|
06.10.2009, 18:37
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Dmitry A. Soshnikov
|
if (...) {
var S = {};
} else {
...
}
|
А если несколько таких if'ов?
Сообщение от Dmitry A. Soshnikov
|
В любом случае (и в твоей реализации тоже), переменная "S" уже будет в объекте переменных.
|
Переменная будет, но значения-то у нее не будет.
|
|
06.10.2009, 18:40
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от Kolyaj
|
А если несколько таких if'ов?
|
Да, я это отметил:
Сообщение от Dmitry A. Soshnikov
|
Ещё преимуществом можно выделить частые подобные проверки с if-ми-else-ами. Чтобы каждый раз не проверять, инициализирован ли уже объект (if typeof S !== 'undefined'), можно вынести его в геттер
|
Сообщение от Kolyaj
|
Переменная будет, но значения-то у нее не будет.
|
Ну так и в простом случае (var S = {}) так же, разницы нет здесь.
|
|
06.10.2009, 18:42
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Dmitry A. Soshnikov
|
Да, я это отметил:
|
И пришел в результате к синглтону, про который сказал в начале
Цитата:
|
На кой ляд? Если можно просто создать объект?
|
|
|
|
|