Структура кода Javascript
Так что я делаю это приложение о тюрьме и заключенных, и т.д., и я использую Шаблон Обозревателя. В идеале я хотел бы иметь только одну глобальную переменную с именем App, и я хотел бы использовать предоставленный код шаблона наблюдателя (по ссылке выше) в качестве помощника в моем приложении.
Например
function App() {
this.helpers = {
prisoners: function ObserverList() {
this.observerList = [];
ObserverList.prototype.Add = function( obj ){
return this.observerList.push( obj );
};
//more stuff
},
prison: function Subject() {
this.observers = new ObserverList();
Subject.prototype.AddObserver = function(observer){
this.observers.Add(observer);
};
//more stuff
},
...
};
this.alcatraz = new this.helpers.prison();
Мой вопрос: имеет ли это смысл с точки зрения ремонтопригодности, лучших практик и т. Д.? Это, безусловно, выглядит лучше, чем просто выгрузка кода Observer в виде набора внутренних функций внутри приложения.
С этой реструктуризацией есть проблема в prison
, Поскольку все функции шаблона наблюдателя теперь являются парами ключ / значение внутри this.helpers
Я должен изменить this.observers = new ObserverList();
что-то вроде new this.helpers.prisoners();
но ценность this
изменился, и я понятия не имею, как call/apply
с new
оператор. (ЕСЛИ это даже имеет какой-то смысл).
Кроме того, я был бы признателен за любой источник (книга / блог / видео), который содержит примеры, удобные для реального мира, вместо фрагментов кода. Ничего не имею против Адди Османи и его работы, он замечательный парень для всех этих бесплатных ресурсов, но для новичка сделать все вместе иногда сложнее, чем думает про-javascripter (особенно учитывая свободу, которую позволяет Javascript)
Заранее извиняюсь, если мой вопрос звучит "слишком общий" или "неконструктивный", но я был бы признателен за некоторые советы.
1 ответ
Я не использовал шаблон наблюдателя, но вот мои мысли:
Звонок подать на новый, просто имеет смысл. В JS,
new
Оператор эффективно создает пустой объект и назначает егоthis
, Я бы сказал, что это эквивалентноctor.apply({})
за исключением того, что он не будет возвращать вновь созданный объект (вам нужно будет сохранить объект заранее)Вы могли бы определить ctor до этого и просто создать экземпляры помощников:
function App() { function helpers() { var self = this; this.prisoners = function ObserverList() { this.observerList = []; ObserverList.prototype.Add = function (obj) { return this.observerList.push(obj); }; //more stuff }; this.prison = function Subject() { this.observers = new self.prisoners(); Subject.prototype.AddObserver = function (observer) { this.observers.Add(observer); }; //more stuff }; }; this.helpers = new helpers(); this.alcatraz = new this.helpers.prison(); }
Но лично, если вы просто хотите создавать типы, я бы просто объявил их как функции в соответствующей области видимости. Что-то вроде:
function App() {
function prisoners() {
this.observerList = [];
ObserverList.prototype.Add = function (obj) {
return this.observerList.push(obj);
};
//more stuff
};
function prison() {
this.observers = new prisoners();
Subject.prototype.AddObserver = function (observer) {
this.observers.Add(observer);
};
//more stuff
};
this.alcatraz = new this.prison();
}