Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript访问父对象属性_Javascript_Oop_Object - Fatal编程技术网

JavaScript访问父对象属性

JavaScript访问父对象属性,javascript,oop,object,Javascript,Oop,Object,我在JS中遇到了一个小问题,我有两个嵌套对象,我想从父对象访问一个变量,如下所示: var parent = { a : 5, child: { b : 3, displayA : function(){ console.log(this.a); //undefined }, displayB : function(){ consol

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

var parent = {
    a : 5,

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

        displayB : function(){
            console.log(this.b);
            //displays 3
            }
        }
}
displayA : function(){
  console.log(parent.a);
}
我只想知道如何使parent.child.displayA工作:)(我有需要访问父变量的子对象)

谢谢你的帮助 多谢各位

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

查看并实现类似的功能


您可能可以通过
窗口访问父对象。如果父对象在全局范围内,则父对象
,但您的示例并不适用于所有情况。

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

var parent = {
    a : 5,

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

        displayB : function(){
            console.log(this.b);
            //displays 3
            }
        }
}
displayA : function(){
  console.log(parent.a);
}
您不需要将父对象放在全局范围内并使用
窗口。另一个答案建议使用父对象
;由于您在
parent
的范围内声明
displayA
,该函数将关闭
parent
,并且可以在
child
中的任何位置访问该函数。由于闭包包含对
父对象的引用,您将看到对
父对象的更改将反映在
displayA
的行为中。例如,假设
父项
子项
的定义与示例中相同,但
displayA
被修改为使用
parent.a
。然后:

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

综上所述,如果您试图模仿OOP,那么另一个答案是正确的:您应该阅读更多关于Javascript原型链如何工作的内容

我认为这样做没有意义,因为您只能通过其父对象访问子对象。那么,为什么要在可以将mthod displayB添加到可以访问所有子属性的父级时将其添加到子级呢。

您可以使用来设置
的值:

parent.child.displayA.call(parent); // 5
parent.child.displayA = function(){
  console.log(parent.a);
};
parent.child.displayA(); // 5
您也可能对它感兴趣:

或者您可以只使用
父项
而不是

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

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

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

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

displayA
函数中,您才引用“this”并试图访问其“a”属性。这里对“this”的调用是指子对象而不是父对象。如果使用构造函数,可以将其父对象的上下文(this)传递给子对象。或者可以使用调用或绑定方法。