В моей системе у меня есть несколько «классов», загруженных в браузер, каждый из которых представляет собой отдельные файлы во время разработки и объединяется вместе для производства. По мере загрузки они инициализируют свойство глобального объекта 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");
});
Проблема в том, что раньше не было зависимости между сотрудником и компанией во время объявления: вы могли поместить объявление в любом порядке, но теперь, используя RequireJS, это вводит зависимость, которая здесь (намеренно) круговая, поэтому приведенный выше код не работает. Конечно, в addEmployee()
, добавив первую строку var Employee = require("Employee");
будет заставить его работать , но я вижу это решение как хуже не используя RequireJS / AMD , поскольку это требует от меня, разработчик, чтобы быть в курсе этой новой круговой зависимости и сделать что - то об этом.
Есть ли лучший способ решить эту проблему с помощью RequireJS / AMD, или я использую RequireJS / AMD для чего-то, для чего он не предназначен?
function(exports, Company)
иfunction(exports, Employee)
. В любом случае, спасибо за RequireJS, это потрясающе.