【问题标题】:How can I refer to a parent from a child?我如何从孩子那里引用父母?
【发布时间】:2014-06-10 15:15:46
【问题描述】:

标题的措辞可能需要重新审视,但现在考虑以下代码:

var ParentControl = function()
{
    this.ShowAlert = function()
    {
        alert('hi!');
    }

    this.childControl = new ChildControl();
};

var ChildControl = function()
{
    // IN THIS SCOPE HERE I NEED TO CALL 'ShowAlert'
};

var parentControl = new ParentControl();

根据上面代码 sn-p 中的注释,我需要 ChildControl 的实例来调用其父级的“ShowAlert”函数,但我不知道如何。

我的尝试

只需在我写评论的地方调用ParentControl.ShowAlert() - 显然不起作用,因为parentControl 是实例(我不想明确提及)。

我也尝试过将父控件传递给ChildControl 的构造函数,但理想情况下我希望让子控件独立于任何特定类型的父控件。

【问题讨论】:

  • “理想情况下,我希望让子控件独立于任何特定类型的父控件” 在这种情况下,某种事件发布者/订阅模式怎么样? ChildControl 实例发出事件/消息,ParentControl 实例对其作出反应。
  • @FelixKling - 这听起来很理想。我知道我可以在孩子身上将这个事件暴露为this.somethingHappened,但是父母怎么会知道发生了什么事呢?还是我的方法不对?
  • 我不是很擅长阅读,仍然不明白在父级内部传递new ChildControl(this); 的问题是什么?
  • 或者这个 -> jsfiddle.net/mQMUc ?
  • 在孩子内部,你做this.emit('foo'),父母必须用this.childControl.subscribe('foo', callback)听孩子。在您的情况下,似乎事件会在父订阅之前发出,在这种情况下,您还必须实现一种机制,将发出的事件“重播”给新订阅者。 但是 将父项作为依赖项传递给子项是一个更简单的解决方案,如果没有重大理由反对它,您应该使用它。保持简单;)

标签: javascript function oop object instances


【解决方案1】:

我还将 showAlert 移到原型上,这样您就不会在每次实例化 ParentControl 时都在内存中创建新函数。

var ParentControl = function() {
    this.childControl = new ChildControl(this);
};

ParentControl.prototype.showAlert = function() {
  console.log('hello');
};

var ChildControl = function(parent) {
  parent.showAlert();
};

var parentControl = new ParentControl();

【讨论】:

  • 所以,OP 说 “我也尝试将父控件传递给 ChildControl 的构造函数,但是,理想情况下,我希望让子控件独立于任何特定类型的父控件.”,而你的答案是“只是将父母传给孩子”?您似乎专注于技术性(原型)而不是实际问题。
猜你喜欢
  • 2017-05-31
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
相关资源
最近更新 更多