Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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对象';来自另一个孩子的孩子';使用泛型指针初始化子对象_Javascript_Javascript Objects - Fatal编程技术网

引用Javascript对象';来自另一个孩子的孩子';使用泛型指针初始化子对象

引用Javascript对象';来自另一个孩子的孩子';使用泛型指针初始化子对象,javascript,javascript-objects,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_fn

请检查以下对象结构:

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();
});
,只需单击“单击此处”按钮进行测试

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

如果它不是父对象的父对象,我可以使用“this”来访问函数(比如在第5行和第6行中访问“obj#u child#u var”)

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

重构代码的最佳方式是什么,其中的任何子级或多个子级都可以从对象的上根访问任何其他子级,而无需使用对象的直接名称(“obj_parent”),但更多的是一种通用方式

比如:让self_root=指向“obj_父对象”的指针; 在每一层中,在“obj_父级”中的任何地方,都使用这个self_根而不是“obj_父级”

在这里,我希望将整个代码压缩在内部:obj_parent={..Everything..}

并且不想将任何“obj_parent”代码放在它之外,比如使用:

obj_parent.prototype.**=***

对于通过仅在obj_parent={…}内部重新构造代码来实现这一点的最佳方法,是否有任何建议

简言之,我在obj_parent.obj_child.fnc()中查找类似以下内容:

这样我就不必在obj_parent.obj_fnc()中重命名“obj_parent”;如果根“obj_parent”被重命名

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

我会改用IIFE,这样您就可以在IIFE的作用域内为对象指定您想要的任何名称,并返回对象-然后,您可以将外部变量名称从
obj_parent
重命名为您想要的任何名称,而不会出现问题:

const parentVariableName=(()=>{
常量对象父对象={
obj_儿童:{
obj_child_变量:15,
fnc:函数(){
让自我=这个;
警报('Called:obj_parent>fnc()| obj_child_var:'+self.obj_child_var');
obj_parent.obj_fnc();
}
},
obj_fnc:函数(){
警报('Called:obj_parent>obj_fnc();');
}
};
返回obj_父对象;
})();
parentVariableName.obj_child.fnc()
这里的问题是,如果我必须重命名“obj_parent”,我将不得不在其中的任何地方重命名它

我会改用IIFE,这样您就可以在IIFE的作用域内为对象指定您想要的任何名称,并返回对象-然后,您可以将外部变量名称从
obj_parent
重命名为您想要的任何名称,而不会出现问题:

const parentVariableName=(()=>{
常量对象父对象={
obj_儿童:{
obj_child_变量:15,
fnc:函数(){
让自我=这个;
警报('Called:obj_parent>fnc()| obj_child_var:'+self.obj_child_var');
obj_parent.obj_fnc();
}
},
obj_fnc:函数(){
警报('Called:obj_parent>obj_fnc();');
}
};
返回obj_父对象;
})();

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