我在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工作:)(我有需要访问父变量的子对象)
任何帮助表示赞赏 非常感谢你!
答案 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
的行为中。例如,假设您的示例中定义了parent
和child
,但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();