【问题标题】:js get list of own static properties [duplicate]js获取自己的静态属性列表[重复]
【发布时间】:2018-09-04 19:44:14
【问题描述】:

我有一个具有静态属性的类,我想获取所有属性值的列表:

class TimeRange {
    static ALL = 'all time'
    static MONTH = 'month'
    static WEEK = 'week'
    static DAY = 'day'
}

现在我想得到:['all time', 'month', 'week', 'day']

【问题讨论】:

  • 这在我看来不像是 JavaScript...
  • @AngelPolitis 是。 ES2016
  • Node 好像不这么认为。
  • @Chris There are no static properties in JavaScript (yet): "static 关键字定义了一个静态的方法类。”
  • 静态属性是一个特性提议,可以通过 Babel 使用。

标签: javascript typescript


【解决方案1】:

您的用例是什么?如果您正在寻找一种方法来获得一些可以迭代但也可以通过键引用的属性,那么您可以只使用普通对象:

const timeRanges = {
  ALL: 'all time',
  MONTH: 'month',
  WEEK: 'week',
  DAY: 'day'
}
timeRanges.ALL; // 'all time'
timeRanges.MINUTE; // not allowed
Object.keys(timeRanges).map(key => timeRanges[key]); // ['all time', 'month', 'week', 'day']

类并没有真正设计为迭代其属性。但是,如果它们绝对必须在一个类中,您可以按照here 概述的方法将它们转换为实例属性:

class TimeRange {
  ALL = 'all time'
  MONTH = 'month'
  WEEK = 'week'
  DAY = 'day'
}
Object.getOwnPropertyNames(new TimeRange()); // ['all time', 'month', 'week', 'day'] 

不过,这有点反模式。

您可能会考虑的最后一个选项是使用字符串枚举:

enum TimeRange {
  ALL = 'all time',
  MONTH = 'month',
  WEEK = 'week',
  DAY = 'day'
}
Object.keys(TimeRange).map(key => TimeRange[key]); // ['all time', 'month', 'week', 'day']

(澄清一下,我假设您根据问题中的标签在此处使用 Typescript。如果您不是,那么原始问题上的 cmets 就可以了。您仍然可以使用我的选项 1 和 2建议在这里,但显然没有类型检查的好处。)

【讨论】:

  • 我目前正在努力解决的一个用例是让各个属性相互依赖。示例是我正在构建一个类,该类具有构建 API 端点存储的静态成员。例如,我将“/api1/”、“/api2/”作为两个静态成员,后来,这些端点的扩展是附加的静态成员。如果使用枚举或对象,就不能有这些类型的自引用,对吗?
  • @AdamP。我认为您最好将其作为一个单独的问题提出并更详细地概述您的情况(最好用一个例子) - 很难知道您的评论是什么正确的方法。
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 2020-05-23
  • 2018-01-21
  • 2015-08-13
  • 1970-01-01
  • 2014-12-07
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多