JS: доступ из НОВОГО внутреннего объекта, методы / переменные объекта создателя родительского контейнера - PullRequest
0 голосов
/ 27 ноября 2018

Добрый день всем.

Мне нужно знать, возможно ли что-то подобное и как:

Давайте рассмотрим пример, подобный приведенному ниже:

function ObjectB(pFoo){
  //Some object vars/properties
  this.varX = '';
  
  //Some object methods
  this.methodX = function(){
    //...
    //HERE. is where I want to call the function/method from "my container/parent", which is an instanced ObjectA. How can I call for example, "method2()" from ObjectA?
    //...
  };
  this.methodY = function(){
    //...
    console.log(this.varX);
    //...
  };
  
  //Constructor time
  this.varX = pFoo;
}

function ObjectA(pA, pB){
  //Some object vars/properties
  this.var1 = '';
  this.var2 = '';
  this.innerObjB = null;
  
  //Some object methods
  this.method1 = function(){
    //...
    this.innerObjB.methodY(); //No problem at all: calls method from it's own inner "var/property" self object.
    //...
  };
  this.method2 = function(){
    //...
    this.var2 = 'trololo';
    //...
  };
  this.method3 = function(){
    //...
    this.innerObjB.methodX();
    //...
  };
  this.method4 = function(){
    //...
    console.log(this.var2);
    //...
  };
  
  //Constructor time
  this.var1 = pA;
  this.var2 = pB;
  this.innerObjB = new ObjectB("whatever");
}

//Runtime
var ObjA = new ObjectA("blah", "bleh");
ObjA.method1(); //prints "whatever".
ObjA.method4(); //prints "bleh".
ObjA.method3(); //calls innerObjB.methodX(), which SHOULD call ObjectA method2().
ObjA.method4(); //If previous thing were resolved, now this should print "trololo".

Как этого добиться?Как мне сделать ObjectB methodX (), чтобы вызвать его «контейнер / родительский объект» (не реальный родитель, поскольку это не наследование) ObjectA уже создал метод method2 ()?

Что я думал, так этопередать в качестве параметра объекту B, «this», из объекта A, например:

this.innerObjB = new ObjectB("whatever", this);

Таким образом, у меня будет «полный objectA» внутри ObjectB для доступа.Уже создан и полностью функционален.Но это создает глубокую дыру в моей середине: разве это не редкий вид зависимости "рекурсивности"?Поскольку вы можете получить доступ из B, A снова, и из этого A получить доступ к B и снова, никогда не заканчивайте цикл.Так что это не имеет особого смысла вообще ...

Спасибо за ваше время.

С уважением,

Марк.

1 Ответ

0 голосов
/ 28 ноября 2018

ObjectB нужно сказать, что это за контейнер.Контейнер может быть передан в качестве параметра конструктору.

function ObjectB(pFoo, container) {
  //Some object vars/properties
  this.varX = '';
  this.container = container;

  //Some object methods
  this.methodX = function() {
    this.container.method2();
  };
  this.methodY = function() {
    //...
    console.log(this.varX);
    //...
  };

  //Constructor time
  this.varX = pFoo;
}

function ObjectA(pA, pB) {
  //Some object vars/properties
  this.var1 = '';
  this.var2 = '';
  this.innerObjB = null;

  //Some object methods
  this.method1 = function() {
    //...
    this.innerObjB.methodY(); //No problem at all: calls method from it's own inner "var/property" self object.
    //...
  };
  this.method2 = function() {
    //...
    this.var2 = 'trololo';
    //...
  };
  this.method3 = function() {
    //...
    this.innerObjB.methodX();
    //...
  };
  this.method4 = function() {
    //...
    console.log(this.var2);
    //...
  };

  //Constructor time
  this.var1 = pA;
  this.var2 = pB;
  this.innerObjB = new ObjectB("whatever", this);
}

//Runtime
var ObjA = new ObjectA("blah", "bleh");
ObjA.method1(); //prints "whatever".
ObjA.method4(); //prints "bleh".
ObjA.method3(); //calls innerObjB.methodX(), which SHOULD call ObjectA method2().
ObjA.method4(); //If previous thing were resolved, now this should print "trololo".
...