Javascript ES6:将基类限制为单例

Javascript ES6:将基类限制为单例,javascript,ecmascript-6,javascript-objects,es6-class,Javascript,Ecmascript 6,Javascript Objects,Es6 Class,我有两个子类过一个超级类基类;如果我添加了新的B和C,我会得到两个实例——它们都通过扩展包含基类 问:是否可以对超级家庭设置单身限制 课程,如果是,如何进行 编辑: 我将尝试回答这里的问题 @卡西莫多的克隆人:你想要一个单一模式是什么?您是否怀疑子类化是否可以生成多个超类实例?或者您是否试图阻止多个子类实例-超类应该强制新的C始终返回同一个C实例 如果只有一个类是基类,那么基类调用MongoDB并检索大量数据。当我有两个类扩展一个基类时,我不想调用Mongo并多次存储所有数据。ATM我使用单例模

我有两个子类过一个超级类基类;如果我添加了新的B和C,我会得到两个实例——它们都通过扩展包含基类

问:是否可以对超级家庭设置单身限制 课程,如果是,如何进行

编辑:

我将尝试回答这里的问题

@卡西莫多的克隆人:你想要一个单一模式是什么?您是否怀疑子类化是否可以生成多个超类实例?或者您是否试图阻止多个子类实例-超类应该强制新的C始终返回同一个C实例

如果只有一个类是基类,那么基类调用MongoDB并检索大量数据。当我有两个类扩展一个基类时,我不想调用Mongo并多次存储所有数据。ATM我使用单例模式来防止这种情况发生在独立类上,但是我真的希望在有两个使用相同基类的类的情况下使用这种模式

用另一种方式说,, 我已经验证的问题正在发生:当我有两个类调用一个基类时,基类的构造函数被调用两次,Mongo被命中两次。ATM当基类被扩展调用时,我没有为基类设置单例模式


现在我需要弄清楚如何在由多个类扩展的基类上应用单例模式。由于基类实际上是子类的同一个实例,我甚至不知道这是否可行。

让我们先生成一些到控制台的测试输出。您应该在浏览器中运行它,以获得功能齐全的控制台访问:

阶级基础 { 构造函数值 { this.prop=值; } funcBase{} } B类扩展了基本类 { 构造函数值 { 超价值; } funcB{} } C类扩展基础 { 构造函数值 { 超价值; } funcC{} } 允许 b=新的b'实例b', b2=新的B‘实例B’, c=新的c'实例c' ; //B类和C类的实例是否具有相同的原型? console.log'protob==protoc', Object.getPrototypeOfb==Object.getPrototypeOfc; //假的 //这些实例b和c的原型是否具有理想原型? console.log'proto-protob==proto-protoc', Object.getPrototypeOfObject.getPrototypeOfb==Object.getPrototypeOfObject.getPrototypeOfc; //真的 //B类的两个实例是否具有相同的原型? console.log'protob==protob2', Object.getPrototypeObB===Object.getPrototypeOb2; //真的 //b的原型与Base.prototype相同吗? console.log'proto protob==Base.prototype', Object.getPrototypeOfObject.getPrototypeOfb===Base.prototype; //真的 //让我们在控制台中检查原型 //b的原型是什么 console.log Object.getPrototypeOfb;//具有构造函数B和funcB的实例 //b的原型是什么? console.log Object.getPrototypeOfObject.getPrototypeOfb;//具有构造函数基和funcBase的实例 //检查构造函数B 请尝试{console.dir B;}
catch{console.log B;}/[右键单击输出中的B并在变量检查器中打开]尽管有关SO的多个问题应在多个不同的帖子中发布,以适合SO Q/A格式。。。您打算采用单例模式是什么?您是否怀疑子类化是否可以生成多个超类实例?或者您是否试图阻止多个子类实例-超类应该强制新的C始终返回同一个C实例?每个新实例都会创建一个实例。这就是新的目的,名字说明了一切。一个类是否继承另一个类并不重要。@estus即使违背了语义,JS也可以通过简单地编写return someObject;来重写构造函数的默认返回;。然而,由于原型概念的设计,我不相信有人能找到一种巧妙的方法来阻止子类的构造函数被执行。您需要在最后一个类中实现singleton模式。后者是绝对可能的。或者实现可以在超类中完成,只要它是从子类的构造函数调用的@我说的不是构造函数返回,而是默认行为。问题1可能源于OP对他之前问题的误解,即超级类有它自己的这一点。当然,如果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;