请检查以下对象结构:
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”曾经被重命名。
答案 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()
}