ООП в прототипном стиле
доброго времени суток, решил перейти на прототипный стиль, в принципе с написанием проблем нет (пока), но есть вопросы насчёт производительности, начал с объекта 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, ни один из объектов не имеет параметров, только у методов есть, так что уверенно могу объявить единожды, но как всё-таки лучше? заранее спасибо! |
Rise,
ну пример у меня штучный продукт) а другие продукты нет, для них не помешала бы фабрика) |
Rise,
вы кажется меня не так поняли (ну или я вас не понял), вызвать приходится не один раз, но я не про методы, а про сам класс, то есть new в принципе могу один раз использовать, но так лучше, или каждый раз вызывать через new |
Цитата:
Цитата:
|
Rise,
а в случае использования функционального стиля такого не будет? или так будет только в случае ajax? |
ясно, значит могу и дальше так писать и единожды объявить каждый объект через new и дальше использовать его методы?
насчёт кодировки, сначала был urlencoded, но в этой же статье было написано что для post можно и этот, значения не имеет, и я так поставил чтобы меньше трафика шло |
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,
аа ясно, и такие имеются, например есть Audio и Video, у них есть как свои методы, так и общие, но хоть и общие, всё же какие-то различия есть, потому у них есть общий родитель Media с общими методами, надеюсь на верном пути :) |
Rise,
спасибо большое!) |
Rise,
да, но в моём случае это значения не имеет, все аудио на одно лицо, берётся их продолжительность и кнвертирется в человекопонятный формат, если есть id3 теги, читается инфо оттуда и тд, и всё это одними и теми же методами для всех аудио, получается что-то вроде audio.getDuration, audio.play и тд |
Цитата:
|
destus,
я лучше не буду торопиться с этим) |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Tecvid,
Если Вам надо, Вы можете и отложенные запросы делать, типа window.request = new Ajax // через var не объявлять //another shit here request.foo() // но не забывайте делать тогда delete window.request // или, как вариант(хуже) var request = new Ajax //another shit here request.foo() // но не забывайте делать тогда request = null так Вы (фигурально выражаясь)освободите память. |
Rise,
Че Вы парите? При чем тут open? на этапе open вообще еще ничего не отправляется. |
Rise,
Выражайтесь тогда по русски. Если вы пытаетесь переконфигурировать объект запроса поcле того как вызван метод send, запрос будет сброшен (вызов проигнорирован). Да, это так. Поменьше книжек читайте. |
ребята всем спасибо за помощь, вот только не спорьте)
|
| Часовой пояс GMT +3, время: 19:52. |