我有一个对象作为myObject,我想在myObject.b.c.c3函数中访问parent成员,
以下是我的例子:
var myObject = {
a: {
a1: 1,
a2: 2
},
b: {
b1: 3,
b2: 4,
c: {
c1: 5,
c2: 6,
c3: function() {
//how can here access a.a1, a.a2, b.b1 and b.b2,??
//not use myObject.a.a1, myObject.a.a2, myObject.b.b1....etc
//can like to use this.parent.parent.a.a1??
}
}
}
}
任何想法?
答案 0 :(得分:1)
为什么不改变构建对象的方式?
function getObject() {
var result = {
a: {
a1: 1,
a2: 2
},
b: {
b1: 3,
b2: 4,
c: {
c1: 5,
c2: 6
}
}
};
result.b.c.c3 = (function(parent) {
var myA1 = parent.a.a1;
var myA2 = parent.a.a2;
var myB1 = parent.b.b1;
var myB2 = parent.b.b2;
//and so on
})(result);
return result;
}
然后var myObject = getObject();
c3
已经为正在构造的对象创建了一个闭包。它可以完全访问a.a1,a.a2等。
答案 1 :(得分:0)
函数的内部必须将其他对象属性作为静态标识符调用,并且不能以相对方式引用它们。但是,如果您创建方法来遍历对象文字的属性并将这些方法绑定为Object原型的属性,则可能会发生更改。
答案 2 :(得分:0)
在这些情况下,通常的策略是使用带有模块模式的闭包,并使用范围链来建立关系。
对象不知道,也没有方法可以发现创建它的结构。有许多方法可以创建对象结构,单个对象可以属于许多结构,因此“父”的概念是不可靠的。
使用这个不是一个解决方案,因为函数的这个是通过调用设置的,你不能通过函数的创建方式来设置它(除了ES5 < EM>结合)。
答案 3 :(得分:0)
var myObject = {
a: {
a1: 1,
a2: 2
},
b: {
b1: 3,
b2: 4,
c: {
c1: 5,
c2: 6,
c3: function() {
alert("this.parent.parent.a.a1 is " + this.parent.parent.a.a1);
}
}
},
init: function(obj, flag) {
if (!obj) obj = this;
for (var prop in obj) {
if (typeof obj[prop] == "object" && prop != "parent") {
obj[prop].parent = obj;
arguments.callee(obj[prop], true);
}
}
if (!flag) {
delete this.init;
return this;
}
}
}.init();
然后你必须致电myObject.b.c.c3();
完成。