31.03.2016, 19:38
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
ООП в прототипном стиле
доброго времени суток, решил перейти на прототипный стиль, в принципе с написанием проблем нет (пока), но есть вопросы насчёт производительности, начал с объекта 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, ни один из объектов не имеет параметров, только у методов есть, так что уверенно могу объявить единожды, но как всё-таки лучше? заранее спасибо!
|
|
31.03.2016, 20:15
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
Rise,
ну пример у меня штучный продукт) а другие продукты нет, для них не помешала бы фабрика)
|
|
31.03.2016, 20:32
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
Rise,
вы кажется меня не так поняли (ну или я вас не понял), вызвать приходится не один раз, но я не про методы, а про сам класс, то есть new в принципе могу один раз использовать, но так лучше, или каждый раз вызывать через new
|
|
31.03.2016, 22:48
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
Сообщение от Rise
|
в 5-й строке всегда будет ложь, к тому же если xhr = new XDomainRequest() то это IE8-9, но IE8-9 не поддерживают объекты xhr.upload и FormData, плюс при каждом new проверять излишне.
|
ясно, спасибо, уберу эту строку, ие8 не нужен, для ие9 думал, но ничего, для него сделаю через айфрейм
Сообщение от Rise
|
Tecvid, если "один раз" то новый запрос будет сбрасывать текущий незавершенный запрос.
|
тут можно конкретнее если не трудно, я не совсем понял, в js эта тема как-то не так как в других языках
|
|
31.03.2016, 23:12
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
Rise,
а в случае использования функционального стиля такого не будет? или так будет только в случае ajax?
|
|
31.03.2016, 23:49
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
ясно, значит могу и дальше так писать и единожды объявить каждый объект через new и дальше использовать его методы?
насчёт кодировки, сначала был urlencoded, но в этой же статье было написано что для post можно и этот, значения не имеет, и я так поставил чтобы меньше трафика шло
|
|
01.04.2016, 00:06
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 456
|
|
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(){}
};
Последний раз редактировалось Rise, 01.04.2016 в 00:09.
|
|
01.04.2016, 00:10
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
а какой вариант лучше? как с точки зрения архитектуры, так и с точки зрения производительности
|
|
01.04.2016, 00:22
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
ясно, спасибо, просто мне показалось что так будет не очень-то правильно для объектов с кучей методов, но похожже это не так
|
|
01.04.2016, 00:37
|
Профессор
|
|
Регистрация: 13.12.2013
Сообщений: 175
|
|
Rise,
аа ясно, и такие имеются, например есть Audio и Video, у них есть как свои методы, так и общие, но хоть и общие, всё же какие-то различия есть, потому у них есть общий родитель Media с общими методами, надеюсь на верном пути
|
|
|
|