自从我在一个项目中遇到这个问题以来,这个问题一直困扰着我。
在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'
父级有两个子对象foo
和bar
,而在bar
对象的callFoosMethod
中,我需要访问父级foo
对象的sayHi
方法,但foo
中的parent
嵌套对其父对象一无所知。
有没有办法在嵌套对象中访问父对象?在JavaScript中实际上没有解决这个问题的方法吗?
答案 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'
答案 2 :(得分:0)
我同意本杰明;如果你需要从Bar做Foo的事情,为什么Foo不是Bar的成员?如果父类需要执行Foo方法,它可以通过Bar执行,而不是让Bar知道它在层次结构中的位置。