如何在不直接在JavaScript中访问父引用的情况下访问父对象的其他属性?

时间:2013-12-19 11:36:08

标签: javascript

自从我在一个项目中遇到这个问题以来,这个问题一直困扰着我。

在JavaScript中,通过.表示法很容易访问嵌套对象。有没有办法在嵌套对象中访问父对象?

看看下面的代码:

function Parent() {
  this.foo = new Foo;
  this.bar = new Bar;
}

function Foo () {
  this.sayHi = function () {
    console.log('Hello World');
  }
}

function Bar() {
  this.callFoosMethod = function () {
    // should call object foo's sayHi method and log 'Hello World'
  }
}

var parent = new Parent;
parent.bar.callFoosMethod(); // => should log 'Hello World'

父级有两个子对象foobar,而在bar对象的callFoosMethod中,我需要访问父级foo对象的sayHi方法,但foo中的parent嵌套对其父对象一无所知。

有没有办法在嵌套对象中访问父对象?在JavaScript中实际上没有解决这个问题的方法吗?

3 个答案:

答案 0 :(得分:2)

不,没有。

有一种构图关系。如果要访问“父”,则必须明确传递引用。这是实践。

现在谈谈“为什么”:

'子对象'可以是多个对象的子对象:

var parent = new Parent;
var o = parent.bar;
o.bar.callFoosMethod(); // but o doesn't have a foo

这也会给架构带来问题。循环结构是{​​{3}},对象通信的方式必须尽可能简单。

如果他们需要说话 通过父母,Bar甚至不知道那里有Foo

变通方法


如果必须,这是不好的做法(高度耦合,责任错误等),你可以这样做:

function Parent() {
  this.foo = new Foo(this);
  this.bar = new Bar(this);
}

function Foo (parent) {
  this.sayHi = function () {
    console.log('Hello World');
  }
}

function Bar(parent) {
  this.callFoosMethod = function () {
       parent.foo.sayHi(); // BAD DESIGN WARNING!
  }
}

同样,这是真的糟糕的设计。 完全违反了单一责任原则,关注点分离和清晰沟通。它通常表示设计问题。除非你完全确定它是你需要的,否则要避免它。

答案 1 :(得分:1)

您可以修改函数callFoosMethod以接受Foo对象作为参数。然后调用

说着他。

function Parent() {
  this.foo = new Foo;
  this.bar = new Bar;
}

function Foo () {
  this.sayHi = function () {
    console.log('Hello World');
  }
}

function Bar() {
  this.callFoosMethod = function (obj) {
    // should call object foo's sayHi method and log 'Hello World'
      obj.sayHi();
  }
}

var parent = new Parent;
parent.bar.callFoosMethod(parent.foo); // => should log 'Hello World'

演示:http://jsfiddle.net/RgTLP/

答案 2 :(得分:0)

我同意本杰明;如果你需要从Bar做Foo的事情,为什么Foo不是Bar的成员?如果父类需要执行Foo方法,它可以通过Bar执行,而不是让Bar知道它在层次结构中的位置。