JavaScript访问父对象属性

9

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

非常感谢您提供的任何帮助!


displayA 函数中,您正在引用 "this" 并尝试访问其 "a" 属性。这里对 "this" 的调用是指子对象而不是父对象。如果您使用构造函数,可以将其父级的上下文(this)传递给子对象。或者您可以使用 call 或 bind 方法。 - chRyNaN
6个回答

12
您可以使用call来设置this的值:
parent.child.displayA.call(parent); // 5

你可能也对绑定感兴趣:

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

7
你可以使用 super.prop 来访问父类的属性。当然,前提是你正在使用 ES6。

1

Javascript是基于原型的,它不像PHP或Java一样是常规的面向对象编程语言。

查看继承和原型链,并实现类似于简单的Javascript继承。

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


0

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

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

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

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

所有这些都是说,如果你想模仿面向对象编程,那么另一个答案是正确的:你应该更多地了解Javascript原型链的工作方式。

0

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

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

0

我认为这样做并没有太多意义,因为你只能通过父对象访问子对象。所以为什么要在子对象上添加一个displayB方法呢?而不是将其添加到具有访问所有子属性的父对象上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接