【问题标题】:javascript, polymorphic new Myclass()?javascript,多态 new Myclass()?
【发布时间】:2017-03-09 14:25:55
【问题描述】:

我有很多类具有以下形式。

static defaultInstance() {

 if (!defaultInstance) {
   defaultInstance = new Child1()
 }
 return defaultInstance
}

由于他们有一个共同的基类,我想将共同的功能添加到基类中,但不知道如何。
(新的 Child1() 有问题)

【问题讨论】:

标签: javascript class ecmascript-6


【解决方案1】:

如果Child1 应该引用“当前”类,即调用defaultInstance 的类,那么您可以这样做

defaultInstance = new this();

这遵循正常的 JavaScript 规则:如果您使用 Child1.defaultInstance() 调用函数,则 this 指的是 Child1

但是,这可能无法满足您的要求。如果您在基类上定义defaultInstance,则所有子类共享相同的defaultInstance 变量。

如果你想要一个实例per类,那么每个类都需要自己的defaultInstance方法,或者你需要使用一个属性来代替,例如

if (!this.__defaultInstance) {
  this.__defaultInstance = new this();
}

【讨论】:

  • 有什么理由不使用Map 而不是__defaultInstance?这也需要this.hasOwnProperty('__defaultInstance') 否则类继承可能会破坏它。
  • 您的意思是class name -> instance 地图?那也行。或者可能是WeakMap
  • 例如map.set(this, new this());。 WeakMap 的好调用可能更有意义,但除非您动态声明子类,否则 Map 可能是相对静态的。
  • 您对我的问题的描述非常正确,但我在解决方案部分有点迷失,__defaultInstance 是一个静态成员变量,每个类都有自己的 __defaultInstance ?我猜map 变量可能存在于所有类都可以访问/共享的地方。
  • "每个类都有自己的__defaultInstance" 是的。 “我猜 map 变量可能存在于所有类都可以访问/共享的地方。” 这可能只存在于 bas 类文件中。
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2012-05-15
相关资源
最近更新 更多