Чтобы взять Employee в качестве параметра, зависимость должна быть еще более очевидной для посторонних.

й системе у меня есть несколько «классов», загружаемых в браузер в виде отдельных файлов во время разработки и соединяемых вместе для производства. По мере загрузки они инициализируют свойство глобального объекта, здесьGкак в этом примере:

var G = {};

G.Employee = function(name) {
    this.name = name;
    this.company = new G.Company(name + "'s own company");
};

G.Company = function(name) {
    this.name = name;
    this.employees = [];
};
G.Company.prototype.addEmployee = function(name) {
    var employee = new G.Employee(name);
    this.employees.push(employee);
    employee.company = this;
};

var john = new G.Employee("John");
var bigCorp = new G.Company("Big Corp");
bigCorp.addEmployee("Mary");

Вместо того, чтобы использовать свой глобальный объект, я рассматриваю возможность сделать каждый класс своимМодуль AMDна основеПредложение Джеймса Берка:

define("Employee", ["Company"], function(Company) {
    return function (name) {
        this.name = name;
        this.company = new Company(name + "'s own company");
    };
});
define("Company", ["Employee"], function(Employee) {
    function Company(name) {
        this.name = name;
        this.employees = [];
    };
    Company.prototype.addEmployee = function(name) {
        var employee = new Employee(name);
        this.employees.push(employee);
        employee.company = this;
    };
    return Company;
});
define("main", ["Employee", "Company"], function (Employee, Company) {
    var john = new Employee("John");
    var bigCorp = new Company("Big Corp");
    bigCorp.addEmployee("Mary");
});

Проблема в том, что раньше между Employee и Company не было никакой зависимости объявления времени: вы могли бы поместить объявление в любом порядке, который вам нужен, но теперь, используя RequireJS, это вводит зависимость, которая здесь (намеренно) круговая, поэтому вышеуказанный код не работает. Конечно, вaddEmployee(), добавив первую строкуvar Employee = require("Employee"); было бысделай так, чтобы это работало, но я считаю, что это решение хуже, чем использование RequireJS / AMD, поскольку оно требует от меня, разработчика, знать об этой недавно созданной циклической зависимости и что-то с ней делать.

Есть ли лучший способ решить эту проблему с RequireJS / AMD, или я использую RequireJS / AMD для чего-то, для чего он не предназначен?

Ответы на вопрос(7)

Ваш ответ на вопрос