Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП в прототипном стиле (https://javascript.ru/forum/misc/62234-oop-v-prototipnom-stile.html)

Tecvid 31.03.2016 19:38

ООП в прототипном стиле
 
доброго времени суток, решил перейти на прототипный стиль, в принципе с написанием проблем нет (пока), но есть вопросы насчёт производительности, начал с объекта Ajax (суть не в этом, вопрос никакого отношения не имеет к ajax), вот написал такое в прототипном стиле:

/* === AJAX === */
function Ajax() {
	var xhr = new XMLHttpRequest();

	if (!'onload' in xhr)
		xhr = new XDomainRequest();

	this._xhr = xhr;
}

/** @param {object} options */
Ajax.prototype.request = function(options) {
	var xhr  = this._xhr;

	xhr.open('POST', options.url, true);

	xhr.setRequestHeader('X-REQUESTED-WITH', 'XMLHttpRequest');
	xhr.setRequestHeader('Content-Type', 'multipart/form-data');
	xhr.setRequestHeader('Cache-Control', 'no-cache');

	xhr.onreadystatechange = function () {
		if (xhr.readyState != 4)
			return;

		if (xhr.status == 200 && options.success)
			options.success(xhr.responseText);
	};

	xhr.send(options.data || null);
};

/**
 * @param {Node} form
 * @param {function} success
 */
Ajax.prototype.upload = function(form, success) {
	var xhr       = this._xhr,
		formData  = new FormData(form),
		indicator = getById('indicator');

	xhr.upload.onprogress = function (e) {
		indicator.style.width = Math.round(e.loaded / e.total * 100) + '%';
	};

	xhr.onload = xhr.onerror = function () {
		if (xhr.readyState != 4)
			return;

		if (xhr.status == 200)
			success(xhr.responseText);
	};

	xhr.open('POST', '/upload/', true);

	xhr.setRequestHeader('X-FILE-NAME', 'attach');
	xhr.setRequestHeader('Content-Type', 'multipart/form-data');
	xhr.setRequestHeader('Cache-Control', 'no-cache');

	xhr.send(formData);
};

ajax = new Ajax();
/* === AJAX END === */


и каждый раз когда надо буду обращаться через ajax.request или ajax.upload, это всё работает, НО, как насчёт производительности? мне кажется что объект постоянно будет висеть в памяти и может даже утечка образоваться, планирую далее все объекты таким образом сделать, но сначала хотел бы уточнит стоит ли?

меня больше смущает то, что лучше: один раз вызвать ajax = new Ajax() или каждый раз объявлять через new, ни один из объектов не имеет параметров, только у методов есть, так что уверенно могу объявить единожды, но как всё-таки лучше? заранее спасибо!

Tecvid 31.03.2016 20:15

Rise,
ну пример у меня штучный продукт) а другие продукты нет, для них не помешала бы фабрика)

Tecvid 31.03.2016 20:32

Rise,
вы кажется меня не так поняли (ну или я вас не понял), вызвать приходится не один раз, но я не про методы, а про сам класс, то есть new в принципе могу один раз использовать, но так лучше, или каждый раз вызывать через new

Tecvid 31.03.2016 22:48

Цитата:

Сообщение от Rise
в 5-й строке всегда будет ложь, к тому же если xhr = new XDomainRequest() то это IE8-9, но IE8-9 не поддерживают объекты xhr.upload и FormData, плюс при каждом new проверять излишне.

ясно, спасибо, уберу эту строку, ие8 не нужен, для ие9 думал, но ничего, для него сделаю через айфрейм


Цитата:

Сообщение от Rise (Сообщение 412608)
Tecvid, если "один раз" то новый запрос будет сбрасывать текущий незавершенный запрос.

тут можно конкретнее если не трудно, я не совсем понял, в js эта тема как-то не так как в других языках

Tecvid 31.03.2016 23:12

Rise,
а в случае использования функционального стиля такого не будет? или так будет только в случае ajax?

Tecvid 31.03.2016 23:49

ясно, значит могу и дальше так писать и единожды объявить каждый объект через new и дальше использовать его методы?

насчёт кодировки, сначала был urlencoded, но в этой же статье было написано что для post можно и этот, значения не имеет, и я так поставил чтобы меньше трафика шло

Rise 01.04.2016 00:06

Tecvid,
// можно
function Constructor() {
   this.property = 'property';
}
Constructor.prototype.method1 = function(){};
Constructor.prototype.method2 = function(){};

var object = new Constructor();

// а можно сразу объект присвоить
var object = {
    property: 'property',
    method1: function(){},
    method2: function(){}
};

Tecvid 01.04.2016 00:10

а какой вариант лучше? как с точки зрения архитектуры, так и с точки зрения производительности

Tecvid 01.04.2016 00:22

ясно, спасибо, просто мне показалось что так будет не очень-то правильно для объектов с кучей методов, но похожже это не так

Tecvid 01.04.2016 00:37

Rise,
аа ясно, и такие имеются, например есть Audio и Video, у них есть как свои методы, так и общие, но хоть и общие, всё же какие-то различия есть, потому у них есть общий родитель Media с общими методами, надеюсь на верном пути :)


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