Прототипы или замыкания, что выбрать при создании объекта с методами?

30.04.2014 02:29
0
Был тут разговор с уважаемыми мной разработчиками, по поводу старого доброго холивара на тему замыканий и прототипов - что и когда выбирать.

В JS создать объект с методами можно так (прототипы):

function some() {...}
some.prototype = {
	f1: function() { ... },
	f2: function() { ... }
};

Или - так (замыкания):

function some() {
	...
	return {
		f1: function() { ... },
		f2: function() { ... }
	}
}

И то и другое можно потом вызывать так:

var o = some();
o.f1();
o.f2();

Вопрос в том, чем отличается, что лучше и еще - когда.

Отличает по большей части тем, что при прототипировании создается лишь объект столько раз, сколько был раз порожден прототипный класс, функции из прототипа не создаются заново.

А если использовать замыкания - то создаются и объект и функции столько раз, сколько будет вызвана функция-конструктор.

А что лучше и почему этот вопрос вообще назревает. Ну во-первых, через замыкания код получается короче и иногда читаемей (this например не нужен у переменных), ну а во-вторых, когда можно решить задачу несколькими путями лично мне всегда интересно узнать, какой же из путей - правильней.

После нашего бурного обсуждения формализовать картинку можно так:

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

Однако в случае небольшого количества методов (2-3) и когда таких объектов создается не много, то для краткости можно использовать и замыкания. Плюсы замыкания в том, что они полностью инкапсулируют всю реализацию и выступают в роли "черного ящика", что бывает иногда полезно.

30.04.2014, Protocoder
Написать комментарий