带有子类的构造函数中的 Object.freeze

2024-01-10

如果我希望我的类不可变,我知道我可以使用Object.freeze()。现在,如果我希望我的对象在构造后不可变,我会放Object.freeze(this)作为最后一行进入我的构造函数。但现在,如果我想子类化它,我无法添加更多参数,因为我无法调用this打电话之前super打电话后super它是不可变的:

class A {
  constructor(x) {
    this.x = x
    Object.freeze(this)
  }
}

class B extends A {
  constructor(x, y) {
    this.y = y // nope. No "this" before "super"
    super(x)
    this.y = y // nope. "this" is already frozen
    Object.freeze(this)
  }
}

我正在考虑弄清楚是否通过 super 调用构造函数以跳过冻结并将冻结留给子类,但这会将其留给子类来冻结或不冻结。我该如何最好地处理这个问题?也许有工厂?


首先,你想要混合类(其基本原则基本上是状态可变性和不变性)似乎很奇怪。我认为,具有组合的可组合工厂函数可能更惯用(可能有比以下更好的方法):

function compose(funcs...) {
  return function(...args) {
    const obj = funcs.reduce((obj, func) = >{
      return func(obj, args);
    }, {});
  }
  return Object.freeze(obj);
}

function a(obj, { x }) {
  obj.x = x;
  return obj;
}

function b(obj, { y }) {
  obj.y = y;
  return obj;
}

const ab = compose(a, b);

ab({ x: 1, y: 2 });

或者,如果您想坚持使用类语法,您可以使用新目标检查构造函数是否调用A is a super是否打电话:

class A {
  constructor(x) {
    this.x = x;
    // Not a super call, thus freeze the object
    if (new.target === A) {
      Object.freeze(this);
    }
  }
}

class B extends A {
  constructor(x, y) {
    super(x)
    this.y = y
    if (new.target === B) {
      Object.freeze(this)
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有子类的构造函数中的 Object.freeze 的相关文章

  • 有没有办法在 React.render() 函数中渲染多个 React 组件?

    例如我可以这样做 import React from react import PanelA from panelA jsx import PanelB from panelB jsx React render
  • libxmljs 的替代品 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目标 使用 Node js 访问网页 使用 xpath 语法操作 DOM 并打印新的 DOM libxm
  • 按键对 JavaScript 对象进行排序

    我需要按键对 JavaScript 对象进行排序 因此 以下内容 b asdsad c masdas a dsfdsfsdf 会成为 a dsfdsfsdf b asdsad c masdas 这个问题的其他答案已经过时 与实施现实不符 并
  • 如何设置上传的文件名?

    By using multer I made it to request image file like this 这个文件存储在我设置的 上传 文件夹中 我的代码如下 var multer require multer var uploa
  • Crypto-Js 库的 hmac-256 脚本返回函数结构而不是 Google Apps 脚本中的值,在外部工作正常吗?

    我正在设置一个谷歌电子表格项目来连接到我的 CryptoExchange API 但是当涉及到这个简单的 CryptoJs Hmac sha256 脚本时 它不起作用 它返回函数结构而不是值 而在外部它工作正常 看我的jsfiddle ht
  • 我可以动态创建/销毁 Vue 组件吗?

    因此 我正在创建一个相当复杂的 Vue 应用程序 它从后端 API 获取数据并将其显示在前端 具体取决于用户选择的过滤器 它的默认设置是立即显示所有内容 然后一旦用户选择过滤器 它就会拉出不具有这些属性的 卡片 组件 直到今天 一切都很顺利
  • JavaScript - 无需布尔值即可运行一次

    有没有办法只运行一段JavaScript代码ONCE 而不使用布尔标志变量来记住它是否已经运行过 具体来说not就像是 var alreadyRan false function runOnce if alreadyRan return a
  • Angularjs 完整日历不显示事件

    我正在用那个https github com angular ui ui calendar https github com angular ui ui calendar在 Angularjs 中使用 FullCalendar 它显示日历并
  • 在动态创建的元素上添加事件监听器[重复]

    这个问题在这里已经有答案了 是否可以向所有动态生成的元素添加事件侦听器 Javascript 我不是页面的所有者 因此我无法以静态方式添加侦听器 对于页面加载时创建的所有元素 我使用 doc body addEventListener cl
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • html canvas动画卡顿

    谁能解释为什么提供的画布动画断断续续 我创建了一个测试存根来演示该问题 我在桌面上的 FF Chrome IE 以及 Android 上的 FF 和 Chrome 中看到了卡顿现象 口吃是由于垃圾收集造成的吗 似乎 raf 在每次调用时都会
  • JavaScript:常量属性

    在javascript中 我可以将对象的属性声明为常量吗 这是一个示例对象 var XU Cc Components classes or function aXU this Cc Components classes var XU new
  • 将异步事件监听器与 Nestjs EventEmitter 模块和无服务器函数结合使用

    我正在尝试在 Nestjs EventEmitter 模块的帮助下实现具有无服务器 lambda 函数的异步工作线程 处理程序在发出事件时被调用 但该函数在 async await 调用之前关闭 我尝试过同时使用emit and emitA
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • 尝试使用 Firebug 查找 JavaScript 文件中的函数

    我试图找到这个函数调用 myFooBar 该函数在某些 HTML 中内联引用 但页面加载了大量 JavaScript 并且在每个文件中搜索该函数需要相当多的工作 如何使用 Firebug 找到此函数所在的 JavaScript 文件 打开脚
  • jQuery 悬停时滚动到 div 并返回到第一个元素

    我基本上有一个具有设定尺寸的 div 和overflow hidden 该 div 包含 7 个子 div 但一次只显示一个 我希望当它们各自的链接悬停时能够平滑地垂直滚动 但是 第一部分 div 没有链接 并且是没有悬停链接时的默认部分
  • JavaScript 中的实时摩尔斯电码转换器

    在看到谷歌关于莫尔斯电码 gmail 的愚人节笑话后 我想我应该尝试用 javascript 创建一个实时莫尔斯电码转换器 我正在使用正则表达式和替换将莫尔斯电码更改为字符 例如 replace g a replace g r 我遇到的问题
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • AngularJS 在指令运行之前通过 AJAX 检索数据

    我正在使用 AngularUIuiMap http angular ui github com directives map实例化谷歌地图的指令 uiMap 指令非常适合处理硬编码数据 mapOptions and myMarkers 但是
  • ReactJs 警告:不推荐使用改变“style”。考虑事先克隆它

    我收到以下警告 inWarning div was passed a style object that has previously been mutated Mutating style is deprecated Consider c

随机推荐

  • Python ValueError:池未在异步多处理中运行

    我有一个简单的代码 path filepath1 filepath2 filepath3 def umap embedding filepath file np genfromtxt filepath delimiter if len fi
  • 如何获取 Android 设备的物理方向(以度为单位)。

    我知道我必须使用 OrientationListener 类从设备获取角度 我想要得到 90 和90 之间的角度 我不知道该怎么做 左图 90度 中图 0度 右图 90度 Code class OrientationListener imp
  • 缺少 Microsoft 时区

    我正在考虑使用微软时区 https support microsoft com en gb help 973627 microsoft time zone index values 通过利用系统时区信息 https msdn microso
  • 如何在IDEA中使用类路径而不是模块路径运行Java 9应用程序?

    当我在 IDEA 中运行主类时 它将模块及其依赖项放在模块路径上 是否可以将其更改为类路径 如果您没有定义模块信息 IDEA 会在类路径上设置应用程序和您的依赖项 由于您有一个模块信息 它是一个显式模块 因此它必须位于模块路径上 通常 您现
  • initState 方法中的 Flutter showDialog(context)

    我正在尝试使用showDialog context builder 当用户导航到某个页面时显示问候消息 我通过调用尝试了这个showDialog in the initState该页面上有状态小部件的方法 虽然它确实有效 但我似乎无法访问实
  • 列名称无效。 [ 节点名称(如果有) = t0,列名称 = 版本 ]

    我在尝试查询时遇到问题SQLCE我的 Windows Phone Mango 应用程序中的数据库 当我执行时出现异常 foreach var item in myDataContext MyTable Select item gt item
  • golang中的windows加密rdp密码

    like http play golang org p fD7mx2k4Yc http play golang org p fD7mx2k4Yc windows rdp密码加密http www remkoweijnen nl blog 20
  • 在经典 ASP 中添加逗号的 HTML 表单值

    我有一个经典的 ASP 页面 它会提交回自身 奇怪的是 从选择返回的值的末尾添加了逗号 以前有人遇到过这样的事情吗 有推荐的故障排除步骤或工具吗 我期望值以数字形式返回 它们是选项中显示的值的 ID 我检查了页面中是否有神秘逗号 但无法找到
  • iOS UTF-8 标签字符串

    我有一个 UTF 8 编码字符串 我想在标签中显示它 当我设置断点并检查保存字符串的变量时 一切看起来都很好 但是 当我尝试输出到日志或标签时 我得到拉丁编码 我已经尝试了几乎所有关于 SO 及其他的建议 但我就是无法让字符串正确显示 这是
  • 视图左上角的 GMSMarker 图标 (iOS)

    我正在尝试创建一个包含 GMSMapView 的 UITableViewCell 其中 GMSMarker 位于当前位置的中心 问题是标记总是出现在当前位置的左上角 我不知道如何解决这个问题 我尝试按照以下步骤操作 使用 UItablevi
  • 什么是 { 得到;放; C# 中的语法?

    我正在学习 ASP NET MVC 我可以阅读英文文档 但我不太明白这段代码中发生了什么 public class Genre public string Name get set 这是什么意思 get set 它是所谓的 auto 属性
  • 更改 NSDictionary 中的键名

    我有一个方法 它返回一个带有某些键和值的 nsdictionary 我需要将字典中的键名称更改为新的键名称 但该键的值需要相同 但我被困在这里 需要帮助 此方法仅适用于可变字典 如果新密钥已经存在 它不会检查应该做什么 您可以通过调用 mu
  • 在 Visual C# 中从 RichTextBox 中删除 RichText 格式

    我正在用 C 开发一个高级富文本编辑器 但偶然发现了一个我似乎无法理解的问题 我一直试图让用户将他们的文档保存为文本文件 纯文本 通过使用以下内容 我的 RichTextBox Save 文件 文件路径 PlainText 但问题是 当他们
  • 1.8 与 1.9 中的 BigDecimal

    升级到 ruby 1 9 时 在比较预期值与实际值时 我的测试失败了BigDecimal这是 Float 除法的结果 expected 0 495E0 9 18 got 0 4950000000 0000005E0 18 27 谷歌搜索 b
  • CSS 第一次在 3D 变换时不渲染背面

    我有一个卡片翻转风格的动画 可以将文本区域翻转 180 度 我遇到的唯一问题是 第一次执行翻转时 在经过 90 度后 元素消失 然后在完成 180 度旋转后出现后面的元素 这是带有代码的示例 http jsfiddle net elninj
  • 阻止用户删除 BigQuery 表

    我们正在尝试创建一个非常基本的角色 允许用户查询 BigQuery 表 但不能删除它们 我们正在试验的自定义角色现在具有以下权限 bigquery jobs create bigquery jobs get bigquery jobs li
  • 如何清除 Selectize.js 下拉列表中的选定值?

    我有一个selectize js https selectize github io selectize js 下拉菜单 我必须清除所选值 我已经尝试过这个 如建议的另一个问题 https stackoverflow com questio
  • Nexus 10 Camera.release 挂起 30 秒

    我们是一群正在开发 Android 实时视频处理应用程序的开发人员 最近 一位客户报告我们的应用程序出现冻结 这种情况仅发生在 Nexus 10 设备上 我们自己购买了设备并进行了测试 设备预装了 Android 4 2 我们的应用程序没有
  • 如何将带有 alpha 的 PNG 转换为 RGBA4444 以便在 SpriteKit SKTexture 中使用?

    我有一堆透明 PNG 我想在SKSpriteNode动画与SKTextures 我需要调整内存使用情况SKTextures 通过降低纹理质量RGBA8888 to RGBA4444 我将如何初始化SKTexture with RGBA444
  • 带有子类的构造函数中的 Object.freeze

    如果我希望我的类不可变 我知道我可以使用Object freeze 现在 如果我希望我的对象在构造后不可变 我会放Object freeze this 作为最后一行进入我的构造函数 但现在 如果我想子类化它 我无法添加更多参数 因为我无法调