Структура кода 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 ответ

Я не использовал шаблон наблюдателя, но вот мои мысли:

  1. Звонок подать на новый, просто имеет смысл. В JS, new Оператор эффективно создает пустой объект и назначает его this, Я бы сказал, что это эквивалентно ctor.apply({}) за исключением того, что он не будет возвращать вновь созданный объект (вам нужно будет сохранить объект заранее)

  2. Вы могли бы определить 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();
}
Другие вопросы по тегам