【问题标题】:Is there a way to count instances from a class?有没有办法从一个类中计算实例?
【发布时间】:2019-05-12 20:24:42
【问题描述】:

我需要从该类中跟踪创建了多少个类的实例。我需要每个实例都知道它是“哪个”。

我能想到的唯一方法是使用全局变量,但是……可能有更好的方法。

这是我想要避免的:

class MyClass {
    this.instanceId = (window.instanceCount == undefined) ? 0 : window.instanceCount + 1;
    window.instanceCount = this.instanceId;
    ...
}

【问题讨论】:

  • 使用类变量而不是全局变量,并在构造函数中递增。
  • 只需将window 换成更合适的对象……而且不需要将其设为全局变量,构造函数范围之外的任何变量都可以。

标签: javascript class instance


【解决方案1】:

您可以静态地为您的“类”添加一个计数器。在这里,我使用一个符号来防止名称冲突。请注意,在递增计数器之前,我会检查您是使用 Burrito 作为函数还是类。

function Burrito() {
  if (this instanceof Burrito) {
    Burrito[Burrito.counterName]++;
  }
}

Burrito.counterName = Symbol();
Burrito[Burrito.counterName] = 0;
Burrito.count = () => Burrito[Burrito.counterName];

new Burrito(); // 1
new Burrito(); // 2
Burrito();     // skipped
new Burrito(); // 3

console.log(Burrito.count());

【讨论】:

  • 谢谢,它实际上是唯一跨浏览器的有效答案。不过,我很难理解“Prototype [Prototype.property]”的语法。这如何产生静态属性?
  • 请注意,我实际上并没有在这个答案中使用原型。该属性是在函数本身上设置的,而不是在其原型上。
  • Right :-) Function[Function.property] 是什么意思呢?它确实有效,但我觉得我错过了一些东西。
  • 这与访问属性相同。如果您知道该物业的名称,您只需输入obj.foo。但是,如果为您提供了属性名称,则需要对其进行评估,例如var key = 'some-random-string'; obj[key] 不同于 obj['key']obj.key。在最后两个示例中,您访问了一个名称为 'key' 的属性。在我的回答中,我使用了Symbol() 来防止名称冲突,因为我不知道在访问计数器属性时需要保存和评估它的符号是什么。 (符号是赋予计数器属性的名称)。
【解决方案2】:

您可以使用static属性并在constructor()中增加它

class MyClass{
  static count = 0;
  constructor(){
    this.instanceId = ++MyClass.count;
  }
}
let x = new MyClass();
let y = new MyClass();

console.log(MyClass.count) //2

console.log(x.instanceId); //1
console.log(y.instanceId); //2

【讨论】:

  • 除非那不是有效的 ES8。
  • @Bergi 为什么 ES8 无效
  • 类字段仍然只是一个提案。您应该在使用正在使用它们的代码发布答案时提及这一点。
【解决方案3】:

属性不必在全局范围内:

class MyClass {
    static count = 0;
    instanceId = MyClass.count++;
}

【讨论】:

  • 这看起来不像是有效的 JavaScript
  • @Bergi 有效。
  • 我在 Firefox 中收到了SyntaxError: bad method definition。类(在当前标准中)只能包含方法(和 getter/setter)定义。
  • @Bergi 因为您的浏览器尚未实现此语法。下载 chrome - 或转译。
  • Chrome implementing non-standard features 并默认启用它们不会使此 JavaScript 有效。不要认为它们是理所当然的,并在您使用任何时在您的答案中提及。
猜你喜欢
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2020-12-23
相关资源
最近更新 更多