【发布时间】:2017-05-27 21:39:37
【问题描述】:
我在一个超类(基类)之外有两 (2) 个子类;如果我新建 B 和 C,我会得到两个实例——它们都通过扩展包含基类。
问题:是否可以对 super 设置 Singleton 限制 类,如果是,怎么做?
class A {
constructor(id) {
// => I don't want to make this call (2) times,
// once for B and again for C.
let {
firstName: this._FirstName
} = CollectionName.findOne({userId: id});
}
}
export class B extends A {
constructor(id) {
super(id);
}
get FirstName() {
return this._FirstName;
}
}
export class C extends A {
constructor(id) {
super(id);
}
get FirstName() {
return this._FirstName;
}
}
import { B, C } from 'imports/server/a-b-c.js'
const b = new B('123')
const c = new B('456')
const FirstNameB = b.FirstName;
const FirstNameC = c.FirstName;
编辑:
我将尝试在这里回答问题。
@卡西莫多的克隆:你有一个单例模式的意图是什么?您是否只是怀疑子类化是否可以生成多个超类实例?或者您是否尝试防止多个子类实例 - 超类应该强制新 C 始终返回同一个 C 实例?
基类调用 MongoDB 并检索大量数据(如果只有一个类,它就是基类)。当我有两个类扩展一个基类时,我不想调用 Mongo 并多次存储所有这些数据。 ATM 我使用单例模式来防止这种情况发生在单独的类中,但我真的很想在我有两个使用相同基类的类的情况下使用这种模式。
换个说法, 我已经验证的问题正在发生:当我有两个类调用一个基类时,基类的构造函数被调用了两次,Mongo 被击中了两次。 ATM 当它被扩展调用时,我没有为基类设置单例模式。
现在我需要弄清楚如何在由多个类扩展的基类上应用单例模式。而且由于基类实际上是子类的同一个实例,我什至不知道这是否可能。
【问题讨论】:
-
虽然超过 1 个关于 SO 的问题应该发布在多个不同的帖子中以适应 SO Q/A 格式...你打算使用单例模式是什么?您是否只是怀疑子类化是否可以生成多个超类实例?或者您是否尝试阻止多个子类实例 - 超类应该强制
new C始终返回同一个 C 实例? -
使用每个
new创建一个实例(this)。这就是new的目的,这个名字说明了一切。一个类是否继承另一个类并不重要。 -
@estus 即使违背语义,JS 确实提供了通过简单地编写
return someObject;来覆盖构造函数默认返回的能力。然而,由于原型概念的设计,我不相信有人能找到一种棘手的方法来阻止子类的构造函数被执行。您需要在最终类中实现单例模式。后者绝对是可能的。或者实现可以在超类中完成,只要它是从子类的构造函数中调用的。 example -
@Quasimodo'sclone 我不是在谈论构造函数返回,而是在谈论默认行为。问题 1 可能是由于 OP 对他之前的问题的误解,即 super class 有它自己的 this。当然,如果 super 返回一个单例,无论是直接实例化还是从子类实例化,都只会有 1 个实例。
标签: javascript ecmascript-6 javascript-objects es6-class