关于javascript:RequireJS,循环依赖关系并导出“魔术”方法

RequireJS, Circular Dependencies and Exports “Magic” Method

我一直在尝试使用詹姆士·伯克(James Burke)对这个问题的答案所建议的特殊"导出"魔术模块来设置RequireJS来处理循环依赖关系。

按照@jrburke在该问题中给出的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
define("Employee", ["exports","Company"], function(Company) {
    function Employee(name) {
        this.name = name;
        this.company = new Company.Company(name +"'s own company");
    };
    exports.Employee = Employee;
});
define("Company", ["exports","Employee"], function(Employee) {
    function Company(name) {
        this.name = name;
        this.employees = [];
    };
    Company.prototype.addEmployee = function(name) {
        var employee = new Employee.Employee(name);
        this.employees.push(employee);
        employee.company = this;
    };
    exports.Company = Company;
});

jsfiddle

问题在于,使用他自己的示例,未定义exports模块,因此未设置exports.Employeeexports.Company。 如果我尝试将exports作为define回调函数的参数包括在内,则在两种情况下它都将初始化为空,并且不携带为其分配的构造函数。

我究竟做错了什么?

编辑:通过反复试验,我得到了上面的代码,其工作地址为:http://jsfiddle.net/jpk45vow/4/。 谁能解释它为什么起作用,因为这对我来说毫无意义。


编辑:我找不到有关魔术导出方法的更多信息。 但是,我可以使用虚拟的"容器"模块来模仿其预期的行为。 在这个小提琴中查看它:http://jsfiddle.net/amenadiel/a7thxz98/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
console.log("start");

define("Container",function() {
    var Container={};
    return Container;
});


define("Employee", ["Container"], function(Container) {
    var Employee= function(name) {
        this.name = name;
        this.company = new Container.Company(name +"'s own company");
    };
    Container.Employee = Employee;
});

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

define("main", ["Container","Employee","Company" ], function ( Container) {
    var john = new Container.Employee("John");
    var bigCorp = new Container.Company("Big Corp");
    bigCorp.addEmployee("Mary");
    console.log(bigCorp);
});

require(["main"]);