Я полагаю, ваш код перегружен.Я пересмотрел и упростил его, как можно увидеть здесь .Если вы действительно хотите интенсивную настройку ООП, я рекомендую использовать клиентскую конструкцию MVC (Backbone, knockout и т. Д.), Чтобы сделать это правильно или оставить ее легкой.
Я продолжу общие отзывы о вашем коде.
/* Stream Class
------------------------------------------*/
function Stream(){
// Disables multiple Stream objects
if (this.singleton)
return
else
this.__proto__.singleton = true;
this.elements = jQueryMapping(this.selectors) // Converts a map of selectors to a map of jQuery objects
this.initEvents();
}
Нет причин использовать подобный синглтон.Также очень плохо использовать .__proto__
Я бы порекомендовал такой шаблон вместо этого.
var Stream = (function() {
var Stream = function() { ... };
// prototype stuff
var stream = new Stream();
return function() {
return stream;
};
})());
Хранение такого хеша данных, как этот, в прототипе не нужно,
Stream.prototype.selectors = {
stream : '#stream',
post_content : '#post-content',
add_post: '#add-post',
// ... more action selectors
}
Вместо этого вы можете включить это как хэш по умолчанию.
(function() {
var defaults = {
stream : '#stream',
post_content : '#post-content',
add_post: '#add-post',
// ... more action selectors
}
function Stream() {
...
this.elements = jQueryMapping(defaults);
}
}());
Ваша служебная функция может быть немного оптимизирована.
$map[key] = (context) ? $(value, context) : $(value);
Это можно переписать как
$map[key] = $(value, context)
Поскольку, если context
не определено, вы просто передаете неопределенный параметр, который аналогичен передаче без параметра.