Ссылка на дочерний объект Javascript Object от дочернего дочернего объекта с использованием универсального указателя - PullRequest
0 голосов
/ 03 сентября 2018

Пожалуйста, проверьте следующую структуру объекта:

var obj_parent = {
    obj_child : {
        obj_child_var : 15,
        fnc : function() {
            let self = this;
            alert('Called : obj_parent>fnc() | obj_child_var : '+self.obj_child_var);
            obj_parent.obj_fnc();
        }
    },
    obj_fnc : function() {
        alert('Called : obj_parent>obj_fnc();');
    }
};

$(function() {
    obj_parent.obj_child.fnc();
});

Тестовый код на Codepen , просто нажмите кнопку «Нажмите здесь» для тестирования.

В строке # 7 obj_parent.obj_child.fnc () вызывает функцию obj_parent.obj_fnc (), которая является родителем его родителя.

Если бы это не был родительский родитель, я мог бы использовать this для доступа (например, к obj_child_var, доступному в строках № 5, № 6) к функции.

Проблема здесь в том, что если мне придется переименовать obj_parent, мне придется переименовывать его везде внутри него.

Каков будет лучший способ реструктурировать код, когда любой дочерний элемент или несколько дочерних элементов внутри него могут получить доступ к любому другому дочернему элементу из верхнего корня объекта, не используя его прямого имени ('obj_parent'), но в более общем смысле.

например: let self_root = указатель на 'obj_parent'; И используйте этот self_root вместо obj_parent внутри каждого уровня, везде внутри obj_parent;

Здесь я хочу сохранить весь код компактным внутри: obj_parent = {..Everything ..}

И не хочу помещать какой-либо код 'obj_parent' вне его, например, используя:

obj_parent.prototype. * * * = * * *;

Есть ли какие-либо предложения по наилучшему способу достижения этого путем реструктуризации кодов только внутри obj_parent = {...}?

Короче, я ищу что-то вроде следующего внутри obj_parent.obj_child.fnc ():

...
fnc : function() {
  let root_obj_pointer = this.parent;// Points to 'obj_parent';
  root_obj_pointer.obj_fnc();// Instead of obj_parent.obj_fnc();
}
...

Так что мне не нужно переименовывать 'obj_parent' в obj_parent.obj_fnc (); если корень obj_parent когда-либо будет переименован.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

В зависимости от вашего использования вы можете переписать свою дочернюю функцию в функцию стрелки, чтобы область видимости была внешним контекстом.

https://codepen.io/anon/pen/rZyPmz?editors=0010

var parent = {
  child: {
    x: 15,
    fnc: () => {
      let y = parent.child.x
      alert('child.fnc(): ' + y)
      parent.fnc(y)
    }
  },
  fnc: function(y) {
    alert('parent.fnc(): ' + y)
  }
};

function btn_clicked() {
  parent.child.fnc()
}
0 голосов
/ 03 сентября 2018

Проблема в том, что если мне придется переименовать obj_parent, мне придется переименовывать его везде внутри него.

Я бы вместо этого использовал IIFE, чтобы вы могли дать объекту любое имя в области видимости IIFE и вернуть объект - тогда вы можете без проблем переименовать имя внешней переменной из obj_parent во что угодно :

const parentVariableName = (() => {
  const obj_parent = {
    obj_child : {
      obj_child_var : 15,
      fnc : function() {
        let self = this;
        alert('Called : obj_parent>fnc() | obj_child_var : '+self.obj_child_var);
        obj_parent.obj_fnc();
      }
    },
    obj_fnc : function() {
      alert('Called : obj_parent>obj_fnc();');
    }
  };
  return obj_parent;
})();


parentVariableName.obj_child.fnc();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...