如何使用和应用 JavaScript 装饰器?

2024-04-15

我试图了解如何在一段非常简单的代码中使用装饰器,这样我就可以将这个概念应用到我更大的项目中。从 Addy Osmani 的文章中得到启发here https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841,我创建了一段简单的代码,如下所示。

比如说,我有一堂课叫Cat,有一个meow()方法,我想用一些日志记录来装饰它,如下所示。

class Cat {
  @logger
  meow() { console.log( ' Meeeoow! ') }
};


function logger(target, key, descriptor) {
  console.log("Cat snarling...");
  return descriptor;
}

const cat = new Cat();
cat.meow();

当我尝试针对 Node.js 解释器(版本 9.1.0)执行此操作时,出现以下错误。



/Users/ravindranath/projects/decorators/index.js:2   @logger   ^

SyntaxError: Invalid or unexpected token
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:152:10)
    at Module._compile (module.js:605:28)
    at Object.Module._extensions..js (module.js:652:10)
    at Module.load (module.js:560:32)
    at tryModuleLoad (module.js:503:12)
    at Function.Module._load (module.js:495:3)
    at Function.Module.runMain (module.js:682:10)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:613:3
  

所以,我的问题是:

  1. Node.js 9.x 支持装饰器语法吗?或者它会在未来的版本中出现吗?

  2. 我看到一些express-js基于 GitHub 上的装饰器,但我无法弄清楚如何创建自己的装饰器。有人可以提供一个使用 Node.js 创建自定义装饰器的简单基本示例吗?


装饰器是notECMAScript 2016(又名 7)的一部分。装饰师目前在第二阶段选秀 https://tc39.github.io/proposal-decorators/一个功能在最终确定并成为语言的一部分之前要经历 4 个阶段。它们可能会在不久的将来集成到该语言中,但其功能和细节可能会发生变化。因此,您必须使用 Babel 等转译器将装饰器转换为 Node 运行时可以理解的代码(ECMAScript 2016),方法是安装transform-decorators https://babeljs.io/docs/plugins/transform-decorators/巴贝尔插件。

至于创建装饰器,您已经这样做了。每个装饰器只是一个包装另一个装饰器的函数,在您的情况下,根据用例提供参数target, key, and descriptor. Your logger功能:

function logger(target, key, descriptor) {
  console.log("Cat snarling...");
  return descriptor;
}

已经是装饰师了。上课属性和方法, target指财产的类别,key是属性名称,并且descriptor是属性的描述符。然后调用装饰器并通过以下方式定义类的属性Object.defineProperty https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty一旦脱糖。你的例子可以归结为:

class Cat { }

let meowDescriptor = {
  type: 'method',
  initializer: () => () => {
    console.log(' Meeeoow! ');
  },
  enumerable: false,
  configurable: true,
  writable: true
}

function logger(target, key, descriptor) {
  console.log("Cat snarling...");
  return descriptor;
}

meowDescriptor = logger(Cat.prototype, 'meow', meowDescriptor);
Object.defineProperty(Cat.prototype, 'meow', {
  ...meowDescriptor,
  value: meowDescriptor.initializer()
});

对于类本身,装饰器采用一个参数,target它描述了装饰类。我建议阅读一些文档 https://github.com/wycats/javascript-decorators/blob/master/README.md熟悉这个主题。

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

如何使用和应用 JavaScript 装饰器? 的相关文章

  • ElectronJS 捕获屏幕质量低

    我正在使用 ElectronJS 测试屏幕捕获 我可以捕获屏幕 但捕获的视频质量低于原始视频 操作系统 Linux Mint 20 电子版本 11 1 0 这是我的代码 我选择我的屏幕 然后使用以下命令在电子应用程序中显示捕获的屏幕vide
  • NodeJS 内存增长 - (系统)内存泄漏?

    我在我们的生活环境中遇到了奇怪的内存泄漏 其中 system 堆中的对象不断增长 堆转储 Here is a memory dump where the memory usage grew to 800MB 请注意 该内存保留在Genera
  • 如何使用restify上传文件

    我正在尝试使用 Restify 模块将图像文件上传到 Rest 服务器 更具体地说是 Confluence 但出现断言错误 我不确定我是否使用正确的方法将文件上传到 REST 服务器 有人能指出我正确的方向吗 这是我的尝试 var rest
  • 在 ExpressJS 中为特定路由链接多个中间件

    我只想验证一些东西 但无法在 Express 文档或在线中找到与此相关的任何内容 尽管我知道这是一个功能 我可以测试一下 但我真的没有一个好的模板 并且希望听到社区的意见 如果我像这样在express中定义一条路线 app get func
  • JavaScript 中的 Promise.all:如何获取所有 Promise 的解析值?

    我编写了以下node js文件 var csv require csv parser var fs require fs var Promise require bluebird var filename devices csv var d
  • 嵌套对象的 AJV 模式验证

    函数返回的对象看起来像这样 answer vehicle type 1 message Car model VW color red 答案 对象始终存在 其他字段基于 vehicle type E g 如果vehicle type 1 则有
  • 如何使用nodejs/aws-sdk将base64编码的pdf直接上传到s3?

    我正在尝试使用以下代码将 base64 编码的 pdf 上传到 S3 而无需将文件写入文件系统 const AWS require aws sdk exports putBase64 async object name buffer buc
  • Node.js 解析路由的最小函数

    我有一个 Node js Express 应用程序正在运行 它接收如下路由 app get resource res someFunction app get foo bar id someOtherFunction 这很棒并且工作正常 我
  • 定时器内嵌套异步等待 - 不返回所需的值

    我必须使用 Mocha 和 chai 测试来测试端点的响应 下面是相同的代码 async function getData userId let response let interval setInterval async gt resp
  • 使用 WebSocket 是否会产生服务器成本?

    我已经离开了 PHP MySQL 的舒适区 因为语法 封装 过程的东西可能会让人沮丧 上周 我开始尝试并按照一些教程使用 Node js Socket IO 创建实时聊天应用程序 到目前为止 我从未使用过 WebSockets 做过任何事情
  • 无法安装js-bson

    我正在使用Windows 7 64位 尝试安装bson作为mongodb的依赖项 我收到此错误 npm WARN package json email protected cdn cgi l email protection No READ
  • NPM 全局标志在 Windows 上似乎不一致

    从控制台运行 gt npm root g 或者以编程方式 var npm require npm npm load null function err npm npm config set global true npm root 我在 W
  • 如何使用 Node.js 解决“找不到模块”错误?

    从 GitHub 拉取模块并按照说明构建它后 我尝试使用以下命令将其拉入现有项目 gt npm install faye 这似乎可以解决问题 gt npm list home dave src server email protected
  • 无对等证书例外 - Volley 和具有自签名证书的 Android

    我正在尝试让我的应用程序通过 https 与我的服务器通信 由于我不想付费让受信任的 CA 签署我的服务器证书 解决方案是使用自签名证书 因此 我创建了 caconfig cnf 如下所示 ca default ca CA default
  • 确保服务器应用程序在摩卡测试开始之前运行

    这类似于确保 Express 应用程序在每次 Mocha 测试之前运行 https stackoverflow com questions 18941736 ensuring express app is running before ea
  • 使用 PassportJS 和 Connect for NodeJS 对 Facebook 用户进行身份验证

    我正在尝试使用 connect 将 Passport 集成到我的 NodeJS 服务器中 但似乎无法正确执行 所有指南 示例都使用expressJS 因此我尽力重新格式化代码以与我的代码一起使用 但我似乎无法让它工作 相关部分写在下面 有人
  • 在 Node.js 中每 4 小时安排一次任务

    如何使用 Node js 中的 node schedule 安排任务在 4 小时后运行 目前我的代码如下 但它没有按预期响应 var schedule require node schedule var task schedule sche
  • Node.js 和代码优先

    我使用代码优先方法开发实体框架 现在我正在学习 Node js 我想知道是否有一种方法可以使用 Node js 和一些库来实现相同的代码优先方法 我正在考虑使用MySql作为数据库 你可以看看续集 http docs sequelizejs
  • 在浏览器中打开的 .mhtml 文件中填写输入

    我想对 mhtml 文件运行 e2e 测试 即填写表格 在 mhtml 文件上查看和提取数据效果非常好 但我无法填写任何内容input字段 既不是手动也不是通过木偶操作者 你可以用这个试试 mhtml 文件 https gist githu
  • 使用单个“proxyServer”将 Websocket 代理到多个目标

    我正在开发一个nodeJS websocket代理服务器 用例是当 websocket 请求到来时 我将检查其凭据 添加新标头 然后根据其组 来自用户 ID 将 websocket 连接重定向到其目标 webscoket 服务器 我发现大多

随机推荐