【问题标题】:What is the proper way to refer to ES.next static class properties?引用 ES.next 静态类属性的正确方法是什么?
【发布时间】:2023-03-23 13:24:01
【问题描述】:

我有以下代码,按预期工作,但我不相信这是正确的方法:

'use strict';

class Upload {
  static uploadCount = 20;

  constructor(props) {
    Upload.uploadCount++;
  }

  static get count() {
    return this.uploadCount;
  }
}

const up1 = new Upload({
  name: 'Wow.pdf',
  size: 123123,
});

const up2 = new Upload({
  name: 'doit.pdf',
  size: 9999999,
});

console.log(Upload.count);

为什么constructor 不能像静态getter 那样通过this.uploadCount 引用静态变量?是否有更好/正确的方法来跟踪实例化 Upload 对象的数量?

【问题讨论】:

  • fwiw,铬 52 日志Uncaught SyntaxError: Unexpected token =,似乎指向static uploadCount = 20;?。见Static methods
  • 没关系,我使用的是 babel,而不是依赖浏览器来支持 ES6 提案。
  • Nit:不是“ES6 提案”,只是 ECMAScript 的语法提案。

标签: javascript class ecmascript-next es6-class


【解决方案1】:

构造函数中的this指的是刚刚创建的对象实例。静态属性是构造函数本身的属性,而不是实例。因此,如果您想从实例方法中引用它们,则必须使用 Upload.uploadCount 中的构造函数名称。


仅供参考,您使用的语法:

static uploadCount = 20;

不是 ES2015 的标准部分,我知道唯一可以确定它可以工作的地方是 Babel。如果你想要可移植的代码并且不使用 Babel,那么你不应该使用那种语法。你可以换成老式的:

Upload.uploadCount = 20;

并将其放在类定义之后并具有可移植性。


仅供参考,您用于静态属性的语法是为将来的 JS 修订提出的,但最后我检查它尚未决定。

【讨论】:

  • 好的,有道理。那么Upload.uploadCount 是从constructor 中引用静态属性的正确方法吗?
  • @ffxsam - 是的,这就是如何从非静态方法的任何地方进行操作。由于静态方法是通过类名引用的,因此静态方法中的this值恰好设置为类名。
  • 您按照我的评论编辑了您的帖子 :) 好的,听起来不错,只是想确保我这样做是正确的。谢谢!
  • 在铬 52 Uncaught SyntaxError: Unexpected token = 处抛出错误?
  • @guest271314 - 好吧,我花了一段时间才明白你在说什么。我会将其添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2012-12-31
  • 1970-01-01
  • 2018-12-31
相关资源
最近更新 更多