JavaScript访问父对象属性

时间:2015-04-19 18:51:32

标签: javascript oop object

我在JS中有一个小问题,我有两个嵌套对象,我想从父级访问一个变量,如下所示:

var parent = {
    a : 5,

    child: {
        b : 3,
        displayA : function(){
            console.log(this.a);
            //undefined
            },

        displayB : function(){
            console.log(this.b);
            //displays 3
            }
        }
}

我想知道如何让parent.child.displayA工作:)(我有需要访问父变量的子对象)

任何帮助表示赞赏 非常感谢你!

6 个答案:

答案 0 :(得分:12)

您可以使用call设置this

的值
parent.child.displayA.call(parent); // 5

您可能也对binding感兴趣:

parent.child.displayA = function(){
  console.log(this.a);
}.bind(parent);
parent.child.displayA(); // 5

或者您可以使用parent代替this

parent.child.displayA = function(){
  console.log(parent.a);
};
parent.child.displayA(); // 5

答案 1 :(得分:5)

您可以使用super.prop访问父类属性。当然,只有你使用的是ES6。

答案 2 :(得分:1)

Javascript是prototype based,它不是像PHP或Java那样的常规OOP语言。

查看Inheritance and the prototype chain并执行类似Simple Javascript inheritance的内容。

如果它位于全局范围内,您可以通过window.parent访问父级,但是您的示例在每种情况下都不起作用。

答案 3 :(得分:0)

对象child没有通用的方法知道它是父对象的成员。在您的情况下,您可以直接引用displayA()中的父对象,如下所示:

displayA : function(){
  console.log(parent.a);
}

您不需要将父级放在全局范围内,并使用window.parent作为另一个答案建议;由于您在displayA范围内声明parent,因此该函数将关闭parent,并且可以在child内的任何位置访问。由于闭包含有对parent对象的引用,因此您会看到对parent的更改将反映在displayA的行为中。例如,假设您的示例中定义了parentchild,但displayA被修改为使用parent.a。然后:

parent.child.displayA(); //=> 5
parent.a = 10;
parent.child.displayA(); //=> 10

所有这些都说,如果你试图模仿OOP,那么另一个答案是正确的:你应该阅读更多关于Javascript原型链如何工作的内容。

答案 4 :(得分:0)

我认为它实际上没有这样做,因为你只能通过它的父访问子对象。那么为什么要向孩子添加一个mthod displayB,同时你可以将它添加到有权访问所有子属性的父级。

答案 5 :(得分:0)

在您的示例中,您没有继承。你可以这样做

...
    displayA : function(){
        console.log(parent.a);
        // 5
    },
...
parent.child.parent = parent;
parent.child.displayA();