19.12.2014, 20:07
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Помогите понять синглтоны
Наткнулся на такой вот пример создания в IO:
Singleton := Object clone
Singleton clone = Singleton
Насколько я понял, аналогом в JS будет:
Object.prototype.clone=function(){return Object.create(this)}
singleton=Object.clone()
singleton.clone=function(){return singleton}
Не могу врубиться, как это можно использовать, нахер это нужно? Покажите, плз, простенький пример какой-нибудь, игрушечный чтоли. Это уже третья попытка, понять сабж Первые 2 -- неудачны
Все, Sweet объяснил доходчиво, тема закрыта
Последний раз редактировалось krutoy, 19.12.2014 в 21:02.
|
|
19.12.2014, 20:39
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
В js это всё не актуально. Ты просто создаёшь объект, как глобальную переменную,
var singleton = {};
и он будет доступен из любых других классов.
singleton актуален для языков, типа C#, где глобальных переменных нет.
|
|
19.12.2014, 20:56
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Sweet,
Понял, спасибо.
Последний раз редактировалось krutoy, 19.12.2014 в 21:01.
|
|
19.12.2014, 21:52
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от Sweet
|
Ты просто создаёшь объект, как глобальную переменную,
var singleton = {};
и он будет доступен из любых других классов.
|
а нафига так делать? что, при этом это будет экземпляр, который будет наследовать необходимую нам функциональность?
Пример на JavaScript с инкапсуляцией
Цитата:
|
Одиночка (англ. Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.
var Singleton = new function() {
var instance;
// Приватные методы и свойства
// ...
// Конструктор
function Singleton() {
if ( !instance )
instance = this;
else return instance;
// Публичные свойства
}
// Публичные методы
Singleton.prototype.test = function() {};
return Singleton;
}
console.assert( new Singleton === new Singleton );
|
Сообщение от krutoy
|
Все, Sweet объяснил доходчиво, тема закрыта
|
как будто первый день замужем
|
|
19.12.2014, 22:48
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от bes
|
что, при этом это будет экземпляр, который будет наследовать необходимую нам функциональность?
|
Будет, если нужно.
Object.prototype.clone=function(){return Object.create(this)}
foo={a: 1}
singleton=foo.clone()
singleton.clone=function(){return singleton}
console.log(
singleton.clone()===singleton.clone(),
singleton.a, singleton.clone().a
)
// true 1 1
Я недавно пришел к выводу, что классы в js -- это пятое колесо. Абсолютно все что можно селать с ними -- можно и без них, причем быстрей, лаконичней и прозрачней. Чтобы убедится в этом, достаточно сравнить няшный синглтон в стиле IO и ту вакханалию, которую ты приводишь в качестве примера. Использование классов в js от непонимания сути js.
Последний раз редактировалось krutoy, 19.12.2014 в 22:55.
|
|
19.12.2014, 23:45
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от krutoy
|
Будет, если нужно. Я недавно пришел к выводу, что классы в js -- это пятое колесо. Абсолютно все что можно селать с ними -- можно и без них, причем быстрей, лаконичней и прозрачней. Чтобы убедится в этом, достаточно сравнить няшный синглтон в стиле IO и ту вакханалию, которую ты приводишь в качестве примера. Использование классов в js от непонимания сути js.
|
написано же, что пример с инкапусляцией
можешь использовать/не использовать этот паттерн для создания модуля
|
|
20.12.2014, 00:13
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
bes,
это был ответ на
Сообщение от krutoy
|
что, при этом это будет экземпляр, который будет наследовать необходимую нам функциональность?
|
Инкапсуляция ортогональна класс-ориентированному интерфейсу, она тут вообще не причем. Инкапсуляцию можно реализовать при любом подходе.
|
|
20.12.2014, 01:25
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от krutoy
|
bes,
это был ответ на
Инкапсуляция ортогональна класс-ориентированному интерфейсу, она тут вообще не причем. Инкапсуляцию можно реализовать при любом подходе.
|
это был ответ на
Сообщение от krutoy
|
Чтобы убедится в этом, достаточно сравнить няшный синглтон в стиле IO и ту вакханалию, которую ты приводишь в качестве примера.
|
в своём ответе я акцентировал внимание на единственность экземпляра, а не на глобальную точку доступа, как это сделал Sweet, хотя возможно он и предполагал, что объект, созданный литералом и так единственный в своём роде
я также был неточен и вместо "наследовал" хотел сказать "получит", акцентируя внимание на создание объектов не при помощи литералов, но так как в контексте ответа смысл особо не терялся, не стал исправлять
|
|
20.12.2014, 02:00
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
bes, пох ваще. Не в настроение устраивать срачи Но вот это - убожество какое-то. Будто бы "неполноценный" js тянется к "совершенным" собратьям Нафига все эти пляски с new и прототипом. Нужна инкапсуляция? Пожалуйста:
var singleton = (function () {
var private = "x";
return {
getX: function () { return private; }
};
}());
Классический js-паттерн.
|
|
20.12.2014, 02:21
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от Sweet
|
Классический js-паттерн.
|
под названием модуль
Сообщение от Sweet
|
bes, пох ваще. Не в настроение устраивать срачи Но вот это - убожество какое-то. Будто бы "неполноценный" js тянется к "совершенным" собратьям Нафига все эти пляски с new и прототипом. Нужна инкапсуляция? Пожалуйста:
|
а хз откуда у них пошёл такой стиль, но по-моему все варианты имеют право на жизнь и не настолько убоги как ты преподносишь
|
|
|
|