2015-04-19 191 views
7

我在JS一个小问题,我有两个嵌套的对象,我想从父访问变量,就像这样:的JavaScript访问父对象属性

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工作:)(我有需要访问父变量的子对象)

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

+0

在'displayA'函数中,您引用“this”并尝试访问其“a”属性。此处对“this”的调用是指子对象而不是父对象。如果你使用了一个构造函数,你可以将它父项的上下文(this)传递给子对象。或者你可以使用调用或绑定方法。 – chRyNaN

回答

10

您可以使用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 
0

对象child没有通用方法知道它是父对象的成员。在你的情况,你可以直接引用父对象displayA(),像这样:

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

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

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

这一切都这样说,如果你正在试图模仿OOP,那么其他的答案是正确的:你应该多看关于如何JavaScript的原型链的作品。

0

我认为这样做并不真的让你这样做,因为你只能通过父对象访问子对象。所以为什么要将方法displayB添加到子项,而您可以将其添加到可访问所有子项属性的父项。

0

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

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

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