前端周刊第十一期

前端周刊发表每周前端技术相关的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢迎大家关注、转载。
如果外链不能访问,关注公众号前端每周看,里面有解决办法

大事件

  • 大事件!大事件!浏览器可能支持运行 Typescript啦——今天,我们很高兴地宣布我们支持并与第三方共同合作来推进 新的 Stage 0 提案,以此为 JavaScript 带来可选和可擦除的类型语法。因为这种新语法不会改变周边代码的运行方式,所以它可以有效地充当注释。我们认为这有可能使 TypeScript 更容易、更快地用于各种规模的开发。

  • Shader Park:使用 JavaScript 创建交互式 2D 和 3D 着色器——一个基于 Web 的开源平台、社区和 库,通过让您使用 JavaScript 程序化地创建着色器和 GPU 来简化神秘的着色器和 GPU 世界。这里有很多可以玩和探索的地方。注意:由于使用了 WebGL,该站点在浏览器上的负担很重,因此可能并不适合所有设备。

  • Prettier 2.6 发布——流行的代码格式化工具现在可以singleAttributePerLine选择每行只放置一个属性(这在某些类型的模板中很常见),添加了 TypeScript 4.6 支持,并在各种上下文中更好地格式化 JS 代码(例如装饰器、内await联JSX,行尾注释)。

  • npm 包如何用于乌克兰反对战争的抗议活动——几天前,依赖node-ipc的项目(例如 Vue CLI)的用户开始注意到一些奇怪的行为,包括文件在地理定位到俄罗斯的系统上被覆盖(或白俄罗斯)和抗议信息。这是一个复杂的故事,也是包装供应链有多脆弱的另一个提醒。如果您愿意, Register有一个更短且更具新闻性的文章。

  • Deno 1.20 已发布——JavaScript / TypeScript 运行时的一个相当大的版本,具有更高的性能、用于运行基准测试和测试套件的新命令、AbortSignal 超时,以及对 V8 10.0 和 TypeScript 4.6 的升级。要是所有项目都写得像这样彻底就好了。

文章

  1. How To Make a Drag-and-Drop File Uploader with Vue.js 3 — 整整四年前,我们链接到Joseph 的使用vanilla JavaScript制作拖放文件上传,但现在他又回来了最新版本的 Vue.js 面临同样的挑战。

  2. 令人愉快的 React 文件/目录结构 — 我们已经介绍了许多此类文章,但对于布局项目的“正确”方式,总是有另一种观点的空间,尤其是 React 本身在这个问题上相当不以为然。

  3. jQuery 源代码中的“双重分配模式” - 作者在 jQuery 的代码中发现了一种有趣的技术,并着手研究它的好处。

  4. Next.js 的新官方“基础”课程 - Next.js 发布了一个新的基础课程,涵盖了 React 的基本知识、它与 Next.js 的关系以及构建第一个 Next.js 应用程序。

  5. Remix vs Next.js - Remix是一个相对较新的基于 React 的全栈框架,由 React Router 背后的原始团队创建。它对更为人所知的Next.js采用了不同的方法。这是关键差异的详细指南。

  6. 创建一个简单的表格排序和分页功能 - 在 JavaScript 的帮助下呈现一个可排序的分页表格。

  7. TypeScript 擅长的地方的讨论 - TypeScript 的 Luke Hoban 和 Daniel Rosenwasser 的采访摘录。

  8. 升级 Next.js 以实现即时性能改进 - Vercel 团队如何将 Next.js 8 演示提升到 Next.js 12 标准并在过程中看到巨大改进的案例研究。

框架发布

  1. Verdaccio 5.8 – 私有 npm 注册表,现在具有可定制的 Web UI。
  2. Vuetify 3.0 Beta – Vue 的材料组件框架。
  3. MDX 2.1 – Markdown 中的 JSX。
  4. React Menu 3.0 – 可定制的嵌套菜单组件。
  5. angular 13.3.0

代码和工具

  1. Peaks 1.0:与音频波形交互的 UI 组件——假设你正在构建某种音频编辑器——这就是你可能想要使用的那种控件。它也来自 BBC,这很酷。
  2. Wave.js 2.0: Real Simple String Diffing — 一个音频可视化库——如果你不需要创建音频编辑器而只想要一个音乐去 wub wub,线条去摆动摆动类型的可视化,这是给你的。这里有一些现场演示。
  3. Faker 6.0:在节点或浏览器中生成大量虚假数据——在维护者“流氓”的问题之后,一个社区团队接管了流行的 Faker 项目,他们的第一个主要版本现已发布,并提供 ESM 支持。v5 到 v6 迁移说明。
  4. sysend.js:在同一浏览器中打开的页面或选项卡之间发送消息——一个小型库,抽象了在同一浏览器中打开的页面之间发送消息的机制。支持跨域通信,基于 localStorage 和 BroadcastChannel API。这是一个演示(如果你打开它两次)。
  5. Chrome 扩展 CLI:下一个 Chrome 扩展的 CLI — 想要尽快为 Chrome 构建扩展?该工具旨在让您尽快走上正确的道路。
  6. js2xml:将 JavaScript 代码转换为 XML 文档——为什么?显然,为了更容易使用 XPath 从其他地方提取东西。
  7. Emoji Button:A Vanilla JavaScript Emoji Picker — 将按钮元素转换为 emoji 选择器(类似于某些操作系统提供的)。
  8. Liqvid 2.1:使用 React、HTML、CSS 和 JS 创建交互式视频——现在您也可以在视频中使用 Web Animations API。
  • 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、付费专栏及课程。

余额充值