ООП в прототипном стиле
доброго времени суток, решил перейти на прототипный стиль, в принципе с написанием проблем нет (пока), но есть вопросы насчёт производительности, начал с объекта 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, время: 09:07. |