Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите понять синглтоны (https://javascript.ru/forum/misc/52448-pomogite-ponyat-singltony.html)

krutoy 19.12.2014 20:07

Помогите понять синглтоны
 
Наткнулся на такой вот пример создания в 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 объяснил доходчиво, тема закрыта

Sweet 19.12.2014 20:39

В js это всё не актуально. Ты просто создаёшь объект, как глобальную переменную,
var singleton = {};

и он будет доступен из любых других классов.
singleton актуален для языков, типа C#, где глобальных переменных нет.

krutoy 19.12.2014 20:56

Sweet,
Понял, спасибо.

bes 19.12.2014 21:52

Цитата:

Сообщение от 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 объяснил доходчиво, тема закрыта

как будто первый день замужем :D

krutoy 19.12.2014 22:48

Цитата:

Сообщение от 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.

bes 19.12.2014 23:45

Цитата:

Сообщение от krutoy
Будет, если нужно. Я недавно пришел к выводу, что классы в js -- это пятое колесо. Абсолютно все что можно селать с ними -- можно и без них, причем быстрей, лаконичней и прозрачней. Чтобы убедится в этом, достаточно сравнить няшный синглтон в стиле IO и ту вакханалию, которую ты приводишь в качестве примера. Использование классов в js от непонимания сути js.

написано же, что пример с инкапусляцией
можешь использовать/не использовать этот паттерн для создания модуля

krutoy 20.12.2014 00:13

bes,
это был ответ на
Цитата:

Сообщение от krutoy
что, при этом это будет экземпляр, который будет наследовать необходимую нам функциональность?

Инкапсуляция ортогональна класс-ориентированному интерфейсу, она тут вообще не причем. Инкапсуляцию можно реализовать при любом подходе.

bes 20.12.2014 01:25

Цитата:

Сообщение от krutoy (Сообщение 347316)
bes,
это был ответ на
Инкапсуляция ортогональна класс-ориентированному интерфейсу, она тут вообще не причем. Инкапсуляцию можно реализовать при любом подходе.

это был ответ на
Цитата:

Сообщение от krutoy
Чтобы убедится в этом, достаточно сравнить няшный синглтон в стиле IO и ту вакханалию, которую ты приводишь в качестве примера.


в своём ответе я акцентировал внимание на единственность экземпляра, а не на глобальную точку доступа, как это сделал Sweet, хотя возможно он и предполагал, что объект, созданный литералом и так единственный в своём роде
я также был неточен и вместо "наследовал" хотел сказать "получит", акцентируя внимание на создание объектов не при помощи литералов, но так как в контексте ответа смысл особо не терялся, не стал исправлять :)

Sweet 20.12.2014 02:00

bes, пох ваще. Не в настроение устраивать срачи:) Но вот это - убожество какое-то. Будто бы "неполноценный" js тянется к "совершенным" собратьям:D Нафига все эти пляски с new и прототипом. Нужна инкапсуляция? Пожалуйста:
var singleton = (function () {
    var private = "x";
    return {
         getX: function () { return private; }
    };
}());
Классический js-паттерн.

bes 20.12.2014 02:21

Цитата:

Сообщение от Sweet
Классический js-паттерн.

под названием модуль

Цитата:

Сообщение от Sweet
bes, пох ваще. Не в настроение устраивать срачи Но вот это - убожество какое-то. Будто бы "неполноценный" js тянется к "совершенным" собратьям Нафига все эти пляски с new и прототипом. Нужна инкапсуляция? Пожалуйста:

а хз откуда у них пошёл такой стиль, но по-моему все варианты имеют право на жизнь и не настолько убоги как ты преподносишь

Safort 20.12.2014 02:33

Sweet,
>> пишет var singleton = (function () {...
>> использует шаблон "модуль"
Классика)


Часовой пояс GMT +3, время: 23:03.