我想实例化两个相互依赖的类:
this.a = null;
this.b = null;
this.a = new A({
b: this.b
}
this.b = new B({
a: this.a
}
问题是如果我这样做b
如果我将它交给构造函数则为null。如何以“优雅”的方式解决鸡肉或鸡蛋问题?或者我必须在实例化之后通过方法设置对b
的引用吗?
答案 0 :(得分:1)
我建议将问题移到A
和B
的构造函数中。
在这种情况下,您可以利用条件(间接)递归:
function A(b)
{
this.b = b || new B(this);
}
function B(a)
{
this.a = a || new A(this);
}
使用||
,您确保对A(this)
和B(this)
的调用不会分别创建另一个B
/ A
,从而结束“鸡/蛋“问题。
然后你可以像
一样使用它们this.a = new A();
this.b = this.a.b;
或
this.b = new B();
this.a = this.b.a;
如果有A
或B
合法地将.b
或.a
设置为null
的情况,您可以使用undefined
和null
区分这些情况,并相应地更改构造函数:
function A(b)
{
this.b = b === undefined ? new B(this) : b;
}
function B(a)
{
this.a = a === undefined ? new A(this) : a;
}
如果A
和B
需要其构造函数的其他参数,或者由于某些其他原因而不应该自己构造另一个B
或A
,那么您可以将它们传递给{来自创建范围的{1}}实例(因为它包含this
和a
字段,其值仅在访问时确定,而不是在b
和A
构建时):
B
如果function A(container)
{
this.container = container;
// Access B via this.container.b
}
function B(container)
{
this.container = container;
// Access A via this.container.a
}
this.a = new A(this);
this.b = new B(this);
和A
无法完全访问容器对象,则可以创建要在其位置使用的中间对象,例如:
B
如果由于某种原因这也是不可接受的,那么您唯一的选择是稍后通过手动分配或通过设置器功能更改var aProxy = { a: null };
var bProxy = { b: null };
this.a = aProxy.a = new A(bProxy);
this.b = bProxy.b = new B(aProxy);
和a.b
的值。