如何访问静态对象父成员?

时间:2011-12-02 06:41:28

标签: javascript

我有一个对象作为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??
            }
        }
    }
}

任何想法?

4 个答案:

答案 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();
完成。