Могу ли я использовать классы внутри шаблона модуля Javascript?

В настоящее время я работаю над приложением, которое использует шаблон модуля javascript (http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html). Можно ли использовать классы javascript в сочетании с этим шаблоном для создания структуры, подобной C#, где классы вложены в пространства имен?

В настоящее время у меня есть это:

app.modules.foo = class {
    constructor() {
        // Module variables
    }

    // Module functions

    get init() {
        // Module initialization function
    }
}

Который я бы тогда назвал так:

var app = {
    modules: {},
    init: function () {
        "use strict";

         this.modules.foo.init();
    }
};

window.addEventListener("DOMContentLoaded", function() {
   app.init(); 
});

person Gilbert    schedule 12.11.2017    source источник
comment
Что вы можете. Это работает, верно?   -  person Bergi    schedule 13.11.2017
comment
Это не сработало, но я обнаружил, что это произошло потому, что я забыл добавить ключевое слово «новое». Теперь это выглядит так: app.modules.foo = new class { constructor() { // Module variables } // Module functions get init() { // Module initialization function } }   -  person Gilbert    schedule 13.11.2017
comment
Есть ли причина использовать это вместо app.modules.foo = (function() {})(); ? Я ожидаю, что классы будут более полезными, потому что они расширяемы, но никто не видел, чтобы кто-то использовал это внутри шаблона модуля.   -  person Gilbert    schedule 13.11.2017
comment
Ах да, я пропустил, что вам нужен одноэлементный объект, а не конструктор. Вы должны использовать классы только в том случае, если хотите создать несколько экземпляров. Не используйте new class {…}!   -  person Bergi    schedule 13.11.2017


Ответы (1)


Конечно! Похоже, вы пытаетесь, чтобы модули представляли одноэлементные объекты, а не классы, которые могут быть созданы? Если это так, проверьте https://github.com/jojois74/recycle.js

Внутри каждого замыкания модуля вы можете создать объект var obj = {}; Добавить свойства; obj.foo = function() {/*etc*/}; Затем верните его: return obj.

Подробности смотрите на readme.md.

person jojois74    schedule 23.11.2017
comment
Это выглядит очень многообещающе. Обязательно посмотрю. Спасибо! - person Gilbert; 23.11.2017