【问题标题】:Javascript Class and extendJavascript 类和扩展
【发布时间】:2020-07-22 12:25:17
【问题描述】:

我不太知道如何表达,所以我会继续深入并尽可能地解释它。

我不太清楚如何在不使用它们或类似的东西的情况下存储类属性。

如果我们有一个 Message 类,其中包含一个名为 addMessage方法

我们想使用这种方法。在一个名为 Magic 的类中。

我们究竟是如何做到这一点的?

class Message {
    constructor(messageContainer) {
        this.message = messageContainer;
    }

    addMessage(msg) {
        this.message.innerText = msg;
    }
}

class Magic extends Message {
    constructor(magic) {
        super();
        this.magic = magic;
    }

    something() {
        this.addMessage('Some random message');
    }
}

我们这样做:

const message = new Message(document.getElementById('message-container'))

在代码中,但从不在任何地方使用 message

相反,我们像这样使用 Magic

const magic = new Magic(something)

然后:

element.addEventListener('click', () => magic.something())

这不起作用,它为什么不起作用似乎是合乎逻辑的,因为消息永远不会被使用,但是我们如何利用 MagicaddMessage 方法/em> 但是?

我已经尝试了一些东西,但除了在super() 内执行document.getElementById 之外似乎没有任何效果,但在我看来,如果我不能以某种方式调用它,这似乎违背了使用类的意义代码并让它保留对消息容器的引用...

有什么想法吗?

【问题讨论】:

  • 感谢 Alex 的帮助!

标签: javascript class inheritance subclass


【解决方案1】:

Magic 构造函数需要采用messageContainer 参数传递给Message 构造函数。

class Magic extends Message {
    constructor(messageContainer, magic) {
        super(messageContainer);
        this.magic = magic;
    }

    something() {
        this.addMessage('Some random message');
    }
}

const magic = new Magic(document.getElementById('message-container'), something)

如果您有很多参数并且不想在调用super() 时将它们全部列出,请使用对象来保存它们而不是使用单独的参数。每个类都可以使用与其相关的对象属性。

class Message {
  constructor(options) {
    this.message = options.messageContainer;
  }

  addMessage(msg) {
    this.message.innerText = msg;
  }
}

class Magic extends Message {
  constructor(options) {
    super(options);
    this.magic = options.magic;
  }

  something() {
    this.addMessage('Some random message');
  }
}

magic = new Magic({
  messageContainer: document.getElementById("message-container"),
  magic: something
});

【讨论】:

  • 但是如果我在 main 类中有太多参数怎么办?这是9个参数。我想要实现的是以某种方式缩短它们,但如果我仍然需要像那样传递它们,那也是一样的。我现在正在尝试并且帮助将初始化的 Message 作为参数传递给 Magic,这很有帮助,因为 Messages 在使用它的地方获得了 2 个参数,并作为 1 个参数传递给 Magic,因此它缩短了它。但是必须有更好的方法,不是吗?
  • 如果您有很多参数,请使用选项对象。然后每个类都可以提取它想要的参数。
  • 你是个天才。令人惊叹的解决方案,如此简单但又如此高效。谢谢你好先生!
【解决方案2】:

您的用例不是继承,而是组合(Behavioral design patterns)。结合 2 个对象一起工作。这是解决这个问题的基本示例。

class MessageContainer {
  constructor(messageContainer) {
    this.message = messageContainer;
  }
  addMessage(msg) {
    this.message.innerHTML = msg;
  }
}
class Magic {
  constructor(msgContainer) {
    this.container = msgContainer;
  }
  something() {
    this.container.addMessage("Some random message"+ new Date().getTime());
  }
}
const container = new MessageContainer(
  document.getElementById("message-container")
);

const magic = new Magic(container);

document.addEventListener("click", () => {
  magic.something();
});
 <div style="height: 100px; color: red;">
        click here
        <br/>
        <span id="message-container"></span>
    </div>

【讨论】:

  • 这正是我为解决这个问题所做的,它有效,但老实说,我不知道这是否是好的做法,但我现在明白了。非常感谢您的贡献,很抱歉我不能将两者都标记为正确答案,因为你们都为这个主题带来了一些非常好的观点,我希望我们都能为也许其他人会感到高兴而感到高兴需要这个线程,也会使用你的解决方案!
  • 你不应该合并其他任务。否则它将是紧密结合的。为您使用委托模式,这样做是有意义的。继承是你想要获得父属性的时候。所以这里继承不好。
  • 是的,我完全同意,经过几个小时的努力使用这个 :D 非常感谢你的洞察力 xdeepakv!
猜你喜欢
  • 2013-02-18
  • 2011-01-16
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多