使用通用指针从另一个孩子的孩子引用Javascript对象的孩子

时间:2018-09-02 21:04:54

标签: javascript javascript-objects

请检查以下对象结构:

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();
});

Test code at Codepen,只需单击“单击此处”按钮进行测试。

在第7行,obj_parent.obj_child.fnc()正在调用函数obj_parent.obj_fnc(),该函数来自其父级的父级。

如果不是父母的父母,我可以使用'this'访问该函数(就像在第5、6行中访问了'obj_child_var')。

这里的问题是,如果必须重命名“ obj_parent”,则必须在其中的任何地方重命名它。

重组代码的最佳方法是什么,使其中的任何子代或更多子代无需使用直接名称('obj_parent')即可从对象的根目录访问任何其他子代,而更像是一种通用方式。

like:let self_root =指向“ obj_parent”的指针; 并在每个级别的“ obj_parent”中的任何位置使用此self_root而不是“ 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_fnc()中重命名“ obj_parent”;如果根“ obj_parent”曾经被重命名。

2 个答案:

答案 0 :(得分:2)

  

这里的问题是,如果我必须重命名“ 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();

答案 1 :(得分:1)

根据您的用法,您可以将子函数重写为箭头函数,因此作用域是外部上下文。

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()
}