Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:从新的内部对象、父容器创建者对象方法/变量访问_Javascript_Oop_Prototypal Inheritance_Circular Reference - Fatal编程技术网

Javascript JS:从新的内部对象、父容器创建者对象方法/变量访问

Javascript JS:从新的内部对象、父容器创建者对象方法/变量访问,javascript,oop,prototypal-inheritance,circular-reference,Javascript,Oop,Prototypal Inheritance,Circular Reference,大家下午好 我需要知道这样的事情是否可能,以及如何: 让我们假设一个如下示例: 函数对象B(pFoo){ //一些对象变量/属性 this.varX=''; //一些对象方法 this.methodX=函数(){ //... //这里是我想从“my container/parent”调用函数/方法的地方,它是一个实例ObjectA。我如何从ObjectA调用例如“method2()”? //... }; this.methodY=函数(){ //... console.log(this.var

大家下午好

我需要知道这样的事情是否可能,以及如何:

让我们假设一个如下示例:

函数对象B(pFoo){
//一些对象变量/属性
this.varX='';
//一些对象方法
this.methodX=函数(){
//...
//这里是我想从“my container/parent”调用函数/方法的地方,它是一个实例ObjectA。我如何从ObjectA调用例如“method2()”?
//...
};
this.methodY=函数(){
//...
console.log(this.varX);
//...
};
//构造时间
this.varX=pFoo;
}
函数对象A(pA,pB){
//一些对象变量/属性
这个.var1='';
this.var2='';
this.innerObjB=null;
//一些对象方法
this.method1=函数(){
//...
this.innerObjB.methodY();//完全没有问题:从它自己的内部“var/property”自对象调用方法。
//...
};
this.method2=函数(){
//...
this.var2='trololo';
//...
};
this.method3=函数(){
//...
this.innerObjB.methodX();
//...
};
this.method4=函数(){
//...
console.log(this.var2);
//...
};
//构造时间
这1.var1=pA;
这1.var2=pB;
this.innerObjB=新对象B(“任意”);
}
//运行时
var ObjA=新对象A(“废话”、“废话”);
ObjA.method1()//打印“随便”。
ObjA.method4()//打印“bleh”。
ObjA.method3()//调用innerObjB.methodX(),后者应调用ObjectA method2()。

ObjA.method4()//如果前面的问题解决了,现在应该打印“trololo”。
ObjectB
需要知道它的容器是什么。容器可以作为参数传递给构造函数

函数ObjectB(pFoo,容器){
//一些对象变量/属性
this.varX='';
this.container=容器;
//一些对象方法
this.methodX=函数(){
this.container.method2();
};
this.methodY=函数(){
//...
console.log(this.varX);
//...
};
//构造时间
this.varX=pFoo;
}
函数对象A(pA,pB){
//一些对象变量/属性
这个.var1='';
this.var2='';
this.innerObjB=null;
//一些对象方法
this.method1=函数(){
//...
this.innerObjB.methodY();//完全没有问题:从它自己的内部“var/property”自对象调用方法。
//...
};
this.method2=函数(){
//...
this.var2='trololo';
//...
};
this.method3=函数(){
//...
this.innerObjB.methodX();
//...
};
this.method4=函数(){
//...
console.log(this.var2);
//...
};
//构造时间
这1.var1=pA;
这1.var2=pB;
this.innerObjB=新对象B(“无论如何”,this);
}
//运行时
var ObjA=新对象A(“废话”、“废话”);
ObjA.method1()//打印“随便”。
ObjA.method4()//打印“bleh”。
ObjA.method3()//调用innerObjB.methodX(),后者应调用ObjectA method2()。

ObjA.method4()//如果前面的问题解决了,现在应该打印“trololo”。
不清楚您试图在这里创建什么对象模型。如果您正在合成,那么通常不会这样做,如果您是,
ObjectB
实例将需要一个
ObjectA
实例来调用其函数。
ObjectB
ObjectA
之间的关系是什么?听起来javascript对象inheritanceWell不是继承。想象一下,objectA是“House()”。在这里面,有一个“Persons()”对象和一个“Furnitures()”对象。然后,在House()对象级别,有一些方法基本上建立了它们之间的相互关系,例如,方法“userSaveToCloset(u,c)”。但是,在某些情况下,在Persons()对象内部,您可能需要调用这个精确的方法。并且重新定义这个inside Persons()类不是一个选项。像这样的。你看,这不是继承,而是它们各自概念之间的关系。两个对象之间的循环引用没有什么错。(不,这里不涉及递归,没有任何东西会试图无休止地遍历属性。这正是我所评论的,但它有一个问题:当您在构造时将容器上下文传递给内部对象时,它会收到一个“上下文”他自己还没有完全创建,所以如果你尝试从内部子对象访问父容器,再从这个容器访问本例中引用的子容器,你不能,它失败了,因为它还没有创建…至少这是我测试过的。我知道这是肮脏的,但在这种情况下,也许让它更好所有正在创建的内容,最后指定“this”通过特定的方法。而不是在构造函数上。只有当
ObjectB
构造函数尝试调用容器上的方法时,这才是问题。如果构造函数只存储对容器的引用,正如我所示,这没有问题。在容器完全构造之后,您才开始调用方法。