前端周刊第六期

前端周刊发表每周前端技术相关的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢迎大家关注、转载。

如果外链不能访问,关注公众号前端每周看,里面有解决办法

大事件

  • Apache ECharts 5.3:开源 JS 可视化库——发行说明详细介绍了最新版本中的内容,包括关键帧动画、自定义加载动画以及性能提升 2-10 倍的新 SVG 渲染器。

  • 跳过 JavaScript?一些后端语言是如何进入前端的——你可能认为这是关于使用 WebAssembly 在浏览器中运行 Python 之类的,但不是。这是关于维护与后端进程的 WebSocket 连接并从后端动态渲染 HTML 的日益流行,如现代 Elixir 和 Rails 堆栈中所见。值得深思!

文章

  1. Angular 编译器的工作原理 — Angular 编译器(称为ngc)是用于编译 Angular 应用程序和库的工具。这篇文章深入探讨了它的作用以及它是如何做到的。

  2. 用 HTML 替换 JavaScript 对话框(部分) — 如何在某种程度上用 HTML 对话框元素替换 JavaScript 对话框,该元素提供与 、 和 方法类似alert()的confirm()功能prompt() 。

  3. Deno 简介:它比 Node 更好吗? - 我们已经多次提到来自 Ryan Dahl 的Deno,就像 Node.js 最初所做的那样,但是如果你还没有检查过,这篇文章涵盖了关键特性,以及 Deno 领先或落后的地方。

  4. 编写我自己的构建系统:将 Gulp 概念与现代 JS 耦合 - 作者发现 Gulp 对流的依赖使得扩展变得复杂,并展示了使用异步生成器解决同一问题的不同方法。

框架发布

  1. Vite 2.8.0 – 下一代前端工具。
  2. RedwoodJS 0.45.0 – 边缘可部署的全栈 JS 框架。
  3. MikroORM 5 - 用于节点的数据映射器 ORM。
  4. AdminJS 5.6 – 内置在 Node.js 中的管理面板。
  5. npm 8.5.0
  6. Ember.js 4.2.0

代码和工具

  1. zx 5.0:用 JavaScript 编写更好的 Shell 脚本:谷歌并没有懈怠,zx一年内发布了第四个主要版本。bash与其使用类似将快速脚本组合在一起的东西,不如使用zxJavaScript 提供相同的功能。v5.0增加了内置的 YAML 支持。
  2. Griffel: CSS-in-JS with Ahead-of-Time Compilation:来自 Microsoft,另一个 CSS-in-JS 选项。这个拥有近乎零的运行时、SSR 支持和使用 JS 对象定义的样式,以及其他特性。
  3. Fable 3.7:成熟的 F# 到 JavaScript 编译器:F#是来自 MS/.NET 稳定版的“功能优先”语言,我总是对它的阅读效果感到震惊。如果您想尝试为前端构建东西,请查看此在线 REPL,其中有一些示例可供修改,包括一个小马里奥(上图)。
  4. puppeteer-to-playwright:Puppeteer 到 Playwright 转换脚本:如果你想在两个流行的浏览器自动化系统之间迁移,这可能会有所帮助。
  5. P42 JavaScript Assistant: Refactoring Hints and Automation for VS Code: 一个 Visual Studio Code 扩展,为您的编辑器带来 67 种自动重构和快速修复常见 JS、TS 和 React 问题,因此您甚至可以在使用普通 linter 之前清理内容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我明白了。下面是一个简单的杂志订阅管理系统的代码实现: ``` #include <iostream> #include <string> using namespace std; class Magazine { protected: string name; string period; double price; public: static int count; Magazine(string n, string p, double pr) : name(n), period(p), price(pr) { count++; } virtual void display() { cout << "Name: " << name << endl; cout << "Period: " << period << endl; cout << "Price: " << price << endl; } }; class WeeklyMagazine : public Magazine { public: WeeklyMagazine(string n, double pr) : Magazine(n, "weekly", pr) {} void display() { cout << "Weekly Magazine:" << endl; Magazine::display(); } }; class MonthlyMagazine : public Magazine { public: MonthlyMagazine(string n, double pr) : Magazine(n, "monthly", pr) {} void display() { cout << "Monthly Magazine:" << endl; Magazine::display(); } }; int Magazine::count = 0; class MagazineSet { private: Magazine* magazines[100]; public: static int count; MagazineSet() {} MagazineSet(const MagazineSet& other) { for (int i = 0; i < other.count; i++) { if (dynamic_cast<WeeklyMagazine*>(other.magazines[i])) { magazines[i] = new WeeklyMagazine(*dynamic_cast<WeeklyMagazine*>(other.magazines[i])); } else if (dynamic_cast<MonthlyMagazine*>(other.magazines[i])) { magazines[i] = new MonthlyMagazine(*dynamic_cast<MonthlyMagazine*>(other.magazines[i])); } } count = other.count; } MagazineSet& operator=(const MagazineSet& other) { if (this != &other) { for (int i = 0; i < count; i++) { delete magazines[i]; } for (int i = 0; i < other.count; i++) { if (dynamic_cast<WeeklyMagazine*>(other.magazines[i])) { magazines[i] = new WeeklyMagazine(*dynamic_cast<WeeklyMagazine*>(other.magazines[i])); } else if (dynamic_cast<MonthlyMagazine*>(other.magazines[i])) { magazines[i] = new MonthlyMagazine(*dynamic_cast<MonthlyMagazine*>(other.magazines[i])); } } count = other.count; } return *this; } void addMagazine(Magazine* mag) { magazines[count] = mag; count++; } void display() { for (int i = 0; i < count; i++) { magazines[i]->display(); } } }; int MagazineSet::count = 0; int main() { MagazineSet set1; WeeklyMagazine mag1("Magazine1", 5.0); MonthlyMagazine mag2("Magazine2", 10.0); set1.addMagazine(&mag1); set1.addMagazine(&mag2); cout << "MagazineSet1:" << endl; set1.display(); MagazineSet set2 = set1; set2.addMagazine(new WeeklyMagazine("Magazine3", 3.0)); cout << "MagazineSet2:" << endl; set2.display(); return 0; } ``` 在上面的代码中,我们定义了一个Magazine类和两个子类WeeklyMagazine和MonthlyMagazine,分别表示周刊和月刊。MagazineSet类用于管理多个杂志的订阅,其中包含了一个Magazine类型的数组magazines,以及一个静态成员变量count,记录当前订阅的杂志数目。 在Magazine类中,我们定义了一个静态成员变量count,用于记录杂志的总数。同时,我们还定义了一个虚函数display,以实现多态。在子类WeeklyMagazine和MonthlyMagazine中,我们重载了这个函数,以实现不同的输出效果。 在MagazineSet类中,我们重载了复制构造函数和赋值运算符,以便正确地复制一个MagazineSet对象。在addMagazine函数中,我们将要添加的杂志指针存储到数组中,并增加count计数器。在display函数中,我们遍历数组并调用display函数输出每个杂志的信息。 在main函数中,我们创建了一个MagazineSet对象set1,并向其中添加了两个杂志对象。然后,我们复制了set1对象,并向复制的对象set2中添加了一个杂志对象。最后,我们分别输出了set1和set2对象的杂志信息。 希望这个简单的代码示例能帮助你更好地理解继承和多态的概念。如果你还有其他问题或者需要进一步的解释,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiyangbaixue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值