混合构造函数并在 Javascript 代理对象上应用陷阱

2023-12-31

我有一个类,我想对其应用代理,观察方法调用和构造函数调用:

计算器.js

class Calc {
  constructor(){}

  add(a, b) {
    return a+b;
  }

  minus(a, b) {
    return a-b;
  }
}

module.exports = Calc;

index.js

const Calculator = require('./src/Calculator');

const CalculatorLogger = {
  construct: function(target, args, newTarget) {
      console.log('Object instantiated');
      return new target(...args);
  },
  apply: function(target, thisArg, argumentsList) {
      console.log('Method called');
  }
}
const LoggedCalculator = new Proxy(Calculator, CalculatorLogger);
const calculator = new LoggedCalculator();
console.log(calculator.add(1,2));

当调用它时,我期望输出为:

对象实例化

调用的方法

但是,应用没有被调用,我认为这是因为我将代理附加到计算器类,而不是实例化对象,所以不知道apply trap.

我如何构建一个包罗万象的代理来“观察”方法调用和构造函数调用。


我认为这是因为我将代理附加到计算器类,而不是实例化对象,因此不知道应用陷阱。

你是完全正确的,代理作用于对象,所以它不会调用 apply ,除非对象的函数属性Calculator类被调用,如下:

class Calculator {
  constructor() {
    this.x = 1;
  }

  instanceFunction() {
    console.log('Instance function called');
  }

  static staticFun() {
    console.log('Static Function called');
  }

}

const calcHandler = {
  construct(target, args) {
    console.log('Calculator constructor called');
    return new target(...args);
  },
  apply: function(target, thisArg, argumentsList) {
    console.log('Function called');
    return target(...argumentsList);
  }
};

Calculator = new Proxy(Calculator, calcHandler);

Calculator.staticFun();

const obj = new Calculator();

obj.instanceFunction();

清楚了这一点,你可以做什么来包装一个实例Calculator使用代理可能是:

  1. 使用类代理来代理实例construct:
const CalculatorInstanceHandler = {
  apply(target, thisArg, args) {
    console.log('Function called');
    return target(...args);
  }
}

const CalculatorClassHandler = {
  construct(target, args) {
    const instance = new target(...args);
    return new Proxy(instance, CalculatorInstanceHandler);
  }
}
  1. 具有工厂功能Calculator类以便创建代理的实例:
const CalculatorInstanceHandler = {
  apply(target, thisArg, args) {
    return target(...args);
  }
};

class Calculator {

  static getNewCalculator() {
    const instance = new Calculator();

    return new Proxy(instance, CalculatorInstanceHandler);

  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合构造函数并在 Javascript 代理对象上应用陷阱 的相关文章

  • 我如何能够以两行显示标题,并且每行的字体大小不同?

    我正在使用 Google Chart API 创建时间线图 并希望将图的标题修改为两行 问题 我如何能够显示具有不同字体大小的两线图表标题 电流输出 理想输出 相关研究 我唯一能找到的是有人试图用饼图来做到这一点 但我尝试了但无法使其发挥作
  • 暂停除了已激活的玩家之外的所有其他玩家。

    我有这个插件 它可以将不同的样式应用于 html5
  • Chart.js 在初始化时设置活动段

    我正在使用 Chart js v2 并且尝试在加载图表时模拟圆环图上某个段的 悬停状态 因此看起来有一个部分已突出显示 我已经搜索和梳理了代码一天 但找不到一个好的方法来做到这一点 提前致谢 设置片段的悬停样式有点令人困惑 因为它没有真正记
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0

随机推荐

  • 函数返回 Ajax 响应 - 值未定义? jQuery Ajax [重复]

    这个问题在这里已经有答案了 当我警告 jsonServerResponse 函数返回的值时 它的值是未定义的 尽管 JSON 是从 process php 页面返回的 function jsonServerResponse operatio
  • nginx:access.log 和 error.log 文件为空

    我刚刚使用命令在 Ubuntu 14 04 上安装了 nginx sudo apt get install nginx 现在 当我打开浏览器并输入地址时localhost然后我正确地显示了 欢迎来到 nginx 页面 另外 我检查了位于的配
  • Firebase 数据库未找到类错误 (NoClassDefFoundError)

    我有一个使用多个子模块的大型项目 我已将 firebase 数据库依赖项添加到我的项目中包含的模块之一 当本地测试模块作为开放项目包含时 一切正常 当使用封闭模块构建时 我的模块是aar文件 我收到以下错误 java lang NoClas
  • 如何重命名 WordPress 管理仪表板上的 WooCommerce 选项卡下的菜单选项卡

    我需要帮助重命名 WordPress 管理上 woocommerce 选项卡下的选项卡菜单项 我们安装了一个插件 该插件显示为 woocommerce 选项卡上的子菜单 有人可以帮我解决这个问题吗 我发现下面的代码可以重命名选项卡菜单 但我
  • 属性不应返回数组

    是的 我知道这个问题之前已经讨论过很多次了 我阅读了有关这个问题的所有帖子和评论 但似乎仍然无法理解一些东西 MSDN 提供的解决此违规问题的选项之一是返回收藏 or an 界面这是由一个实现的收藏 在访问该属性时 无论它多么明显并不能解决
  • Flex 默认规则

    如何自定义 Flex 的默认操作 我发现类似 的内容 但当我运行它时 它显示 柔性扫描仪卡住 还有 规则仅添加一条规则 因此它也不起作用 我想要的是 comment comment return 1 default return 0 lt
  • &'a T 是否意味着 T: 'a?

    从我自己的理解和实验来看 这似乎是正确的 但我还没有找到记录它的权威来源 Rust by Example 有一个bounds https doc rust lang org rust by example scope lifetime li
  • Google Play 中不允许使用 com.example 包名称

    我是 Android 应用程序开发新手 我正在创建简单的 Android 应用程序 导出 android 应用程序并将包名称指定为AndroidManifestfile包名为 com example zingyminds apk 现在我得到
  • 使用 FFT 进行高斯图像滤波

    对于图像分割 我使用 OpenCV 的高斯特征差异GaussianBlur 范围从 0 8 到 8 43 指数步长为 1 4 我的图像尺寸为 4096 x 2160 因此这需要相当长的时间 在一个核心上需要 8 秒 这在处理视频时相当长 您
  • 如何更改活动/选定选项卡的颜色?

    我希望当未选择选项卡时颜色为默认灰色 但作为我的颜色tabBarColor选择选项卡时的颜色 我找不到更改标签栏中标题颜色的方法 我怎样才能做到这一点 这是我的代码 Home screen TabNavigator Home screen
  • lub(T1,...Tn) 是什么意思?

    以下引用来自 JLS 14 20 http docs oracle com javase specs jls se8 html jls 14 html jls 14 20 异常参数的声明类型 将其类型表示为 与替代方案 D1 的结合D2 D
  • OpenCV 霍​​夫圆

    我使用 Xcode 和 c 我已经从以下位置复制了 HoughCircles 代码OpenCV 文档 http opencv willowgarage com documentation cpp feature detection html
  • 在 SageMath 中运行时使用 Dask 会抛出 ImportError

    最近 我一直在尝试使用 Dask 并行化一些 Sage 运行 OSX 11 2 3 的 MacBook Pro 上的 Sage 9 4 代码 我遇到的问题是 虽然我可以在 Sage 中运行 Dask 但每当我包含任何非 纯 python 代
  • 我们可以将事件侦听器添加到“Vega-Lite”规范吗?

    我是 Vega 和 Vega Lite 的新手 我正在使用 Vega Lite 创建一个简单的条形图 但我无法添加任何事件侦听器 例如 徘徊 我想将鼠标悬停在一个栏上并更改该栏的颜色 如果您正在使用Vega嵌入 https github c
  • 如何收到图库应用程序可见的每个新图像的通知?

    背景 当用户下载新图像或使用相机捕获图像时 图库应用程序将更新以显示新图像 我需要在创建每个新图像后立即收到通知 无论它是如何创建的 相机 浏览器 就像图库应用程序所示 问题 事实证明 有一个 mediaScanner Android 组件
  • Curl:传输已关闭,剩余未完成的读取数据

    我遇到了大卷曲调用的问题 I get nread 传输已关闭 剩余未完成的读取数据 并且内容已部分交付 GET stats stats breakdown track track campaign search criteria 2 per
  • 无法生成用于构建和调试的资产。 OmniSharp 服务器未运行

    在 Visual Studio VS Code 上 使用 C 进行编码 我正在尝试生成要构建和调试的资产 但收到以下错误消息 无法生成用于构建和调试的资产 OmniSharp 服务器未运行 我在跑 NET版本3 1 301 视窗8 1 Vi
  • 从小表中删除重复行

    我在 PostgreSQL 8 3 8 数据库中有一个表 该表没有键 约束 并且有多行具有完全相同的值 我想删除所有重复项并仅保留每行的 1 个副本 特别有一列 名为 key 可用于识别重复项 即每个不同的 key 应该只存在一个条目 我怎
  • 需要在ggplot2中绘制条形图(以百分位方式)

    嗨 我有一个这样的数据集 ALL Critical Error Warning Review 2016 1412 475 4 125 154 45 49 2 58 116 86 12 1 17 我想使用 ggplot2 绘制堆叠条形图 其中
  • 混合构造函数并在 Javascript 代理对象上应用陷阱

    我有一个类 我想对其应用代理 观察方法调用和构造函数调用 计算器 js class Calc constructor add a b return a b minus a b return a b module exports Calc i