javascript - 如何在 Javascript 类中声明只读静态属性?

标签 javascript oop

如何在 Javascript 类中声明只读静态属性? 我试图在 javascript 类中声明只读静态属性,但无法弄清楚如何做到这一点。 普莱赫 除了 Object.defineProperty(obj, prop, Descriptor) 之外的任何解决方案

类似这样的事情...

class KeyHandler  {
static readonly  KEYS = {
        DIRECTOR: 'director',
        VISION: 'vision',
        ABOUT: 'about',
    }
}

最佳答案

同时available in TS ,JS 中没有 readonly 修饰符(至少在 2021 年 6 月)。有a long discussion关于它,但除非我错过了什么,否则它还没有产生任何结果。

您可以防止使用 getter 函数重写属性(如其他答案所示),但您似乎更感兴趣的是防止意外修改值对象。如果是这样,现在可用的一个选项是使用 Object.freeze 来模拟只读:

class KeyHandler {
   static KEYS = Object.freeze({
     DIRECTOR: 'director',
     VISION: 'vision',
     ABOUT: 'about',
   })
}

引用the docs :

A frozen object can no longer be changed; freezing an object prevents new properties from being added to it, existing properties from being removed, prevents changing the enumerability, configurability, or writability of existing properties, and prevents the values of existing properties from being changed. In addition, freezing an object also prevents its prototype from being changed.

此后,任何修改 KeyHandler.KEYS 内部的尝试都将陷入严格模式。但这不会阻止尝试重新分配此属性:这...

KeyHandler.KEYS = `Now I'm changed!`

...仍然有效。要也禁止这种行为,您必须结合:

const KEYS = Object.freeze({
  DIRECTOR: 'director',
  VISION: 'vision',
  ABOUT: 'about',
});

class KeyHandler {
   static get KEYS() { return KEYS }
}

现在尝试重写属性也会引发严格模式:

TypeError: Cannot set property KEYS of class KeyHandler {
  static get KEYS() { return KEYS } 
} which has only a getter

关于javascript - 如何在 Javascript 类中声明只读静态属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68053267/

相关文章:

javascript - 无法在 Google Chrome 扩展程序中获取正确的 Ace 编辑器文本

javascript - 向全局对象添加属性

php - 面向对象的 PHP 和 MVC : calling a method from another controller?

c# - 这种聚合设计模式有名称吗?

c++ - 在类和 cpp 核心指南中初始化优先级变量?

python - 深拷贝特定属性

php - 如何使用 Javascript 提交 POST 变量?

javascript - VueJS v-for 在事件上访问参数和事件对象

javascript - 映射对象数组并使用 React 中的 onClick 更改值

java - OOP:抽象类可以/应该调用它自己的抽象方法吗?