我想要实例两类这两者是互相依赖的,像这样:循环引用实例
this.a = null;
this.b = null;
this.a = new A({
b: this.b
}
this.b = new B({
a: this.a
}
的问题是,如果我这样做b
为空,如果我把它交给构造函数。我怎样才能以“优雅”的方式解决这个鸡或鸡蛋问题?或者,我必须通过方法在实例化之后将参考设置为b
?
我想要实例两类这两者是互相依赖的,像这样:循环引用实例
this.a = null;
this.b = null;
this.a = new A({
b: this.b
}
this.b = new B({
a: this.a
}
的问题是,如果我这样做b
为空,如果我把它交给构造函数。我怎样才能以“优雅”的方式解决这个鸡或鸡蛋问题?或者,我必须通过方法在实例化之后将参考设置为b
?
我建议将问题移至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
自己,你可以通过他们的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
和b.a
值通过手动分配或通过setter功能。
在'A'和'B'的构造函数中做。例如。对于'A',如果它通过'null',则设置'this.b = new B(this);'。当'B'传递'a!= null'时,递归结束。交换'A'和'B'的方法相同。 – Siguza
我认为唯一的方法是在实例化两个对象后使用setter来完成循环。 – Claudiu