发布时间:2026/8/22 14:35:41
如何快速在QuickJS中实现原生类:Opaque与ClassID的Point类案例精讲 如何快速在QuickJS中实现原生类Opaque与ClassID的Point类案例精讲【免费下载链接】QuickJSQuickJS is a small and embeddable Javascript engine. QuickJS sources are copyright Fabrice Bellard and Charlie Gordon.项目地址: https://gitcode.com/gh_mirrors/quick/QuickJSQuickJS 是一个小巧、可嵌入的 JavaScript 引擎支持用 C 语言扩展原生类。本文以仓库自带的 Point 类为例讲透 Opaque 数据与 ClassID 两大核心机制带你一步步看懂 QuickJS 原生类的完整实现流程。 先搞懂Opaque 与 ClassID 两个核心概念在看代码之前先理解支撑 QuickJS 原生类的两个机制概念作用常用 APIOpaque 数据把 C 结构体挂在 JS 对象上供原生方法读写JS_SetOpaque()/JS_GetOpaque2()ClassID 类标识全局唯一的类编号标识 Opaque 的数据类型并绑定 finalizerJS_NewClassID()/JS_NewClass()一句话总结ClassID 告诉引擎这个对象携带的是哪一类 C 数据Opaque 就是被挂载的 C 数据本身。对象被垃圾回收销毁时引擎会自动调用该类注册的 finalizer 释放内存。官方文档在doc/quickjs.texi的 JS Classes 一节约 L878–L900对此有完整说明。 案例拆解Point 类的 4 步实现示例源码位于examples/point.c它定义了一个二维坐标点类并以原生 ES 模块的形式暴露给 JavaScript。第 1 步定义 C 数据结构与 ClassIDtypedef struct { int x; int y; } JSPointData; static JSClassID js_point_class_id;数据结构只有两个整数ClassID 声明为静态全局变量留给模块初始化时分配examples/point.c第 31–36 行。第 2 步编写构造函数构造函数examples/point.c第 45–75 行只做三件事用js_mallocz()分配JSPointData并把参数解析为 x、y从new_target取prototype调用JS_NewObjectProtoClass()创建对象——这一步是未来 JS 端extends继承能正常工作的关键用JS_SetOpaque()把 C 数据挂到对象上返回该对象。任何一步失败都会走fail分支释放内存并返回JS_EXCEPTIONJS 侧因此能收到正常的异常。第 3 步定义属性与原型方法属性访问x和y使用JS_CGETSET_MAGIC_DEF宏定义 getter/setter第 77–101 行。两个属性共用同一对函数靠 magic 值 0/1 区分——非常省代码的惯用法原型方法norm()方法调用sqrt()计算点到原点的模长实现仅几行。注意所有访问器都先用JS_GetOpaque2()取数据并检查是否为 NULL防止访问未正确构造或已销毁的对象。第 4 步注册类并导出模块js_point_init()第 123–141 行的注册流程是固定四步建议直接记住这个骨架JS_NewClassID(js_point_class_id); // 1. 申请类ID JS_NewClass(JS_GetRuntime(ctx), js_point_class_id, js_point_class); // 2. 注册类定义含 finalizer JS_SetConstructor(ctx, point_class, point_proto); // 3. 关联构造函数与 prototype JS_SetClassProto(ctx, js_point_class_id, point_proto); // 4. 设置类的原型最后用JS_SetModuleExport()把 Point 导出为 ES 模块的导出项模块入口是第 143 行起的js_init_module()。 在 JavaScript 中使用与继承使用示例在examples/test_point.js。对 JS 开发者来说Point用起来和纯 JS 类没有任何区别const pt new Point(2, 3); pt.x 4; // setter 生效 pt.norm(); // 得到 5 class ColorPoint extends Point { ... } // 甚至可以直接继承示例中的ColorPoint第 13–21 行直接extends Point新增了一个color属性。之所以继承能正常工作正是构造函数里用new_target取原型这一步的功劳。 快速上手构建与运行git clone https://gitcode.com/gh_mirrors/quick/QuickJS cd QuickJS make ./qjs examples/test_point.jsMakefile第 158 行已把examples/point.so加入自动构建列表make test测试目标第 398 行也会实际运行这份 Point 示例。⚠️ 新手常见坑与最佳实践忘记检查 Opaque 是否为 NULL对象构造失败或已被回收时JS_GetOpaque2()返回 NULL必须立刻返回JS_EXCEPTION构造函数里忽略new_target写死原型对象会导致 JS 端extends继承断链分清 ClassID 与 JSClass 的作用域ClassID 全局分配所有 runtime 共享而JS_NewClass()需要在每个 JSRuntime 中分别调用失败路径也要释放内存构造函数中途失败要记得js_free()finalizer第 38–43 行里对s可能为 NULL 也做了显式防御值得借鉴。 延伸阅读examples/fib.c、examples/c_module.js更轻量的 C 模块入门示例bjson.c、quickjs-libc.c更大规模的真实原生模块官方文档推荐参考doc/quickjs.texiQuickJS 官方手册涵盖内存管理、异常处理、超时中断等进阶主题。小结QuickJS 原生类的配方很简单OpaqueC 数据 ClassID类型注册 原型方法 四行注册流程。掌握examples/point.c这个骨架后你就可以把任意 C 功能以类的形式优雅地暴露给 JavaScript并天然支持 JS 端的继承与扩展。【免费下载链接】QuickJSQuickJS is a small and embeddable Javascript engine. QuickJS sources are copyright Fabrice Bellard and Charlie Gordon.项目地址: https://gitcode.com/gh_mirrors/quick/QuickJS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/8/22 17:30:50

如何在编译时确定宏定义的值

如何在编译时确定宏定义的值 你是不是也碰见过这样的问题: 项目代码里到处是条件编译(#ifdef)、并且条件编译生效判断存在组合宏定义逻辑或者条件编译本身存在多重嵌套的情况,追踪代码时很难确定某个分支逻辑是否生效。同样的&…

2026/8/22 17:30:50

【机器学习】(44)—— 机器学习公平性

【机器学习】(44)—— 机器学习公平性 文章目录【机器学习】(44)—— 机器学习公平性1. 全局指标过关,仍可能伤害部分群体1.1 一个容易被忽略的场景2. 机器学习公平性在问什么问题2.1 与预测偏差篇的关系2.2 公平性讨论…

2026/8/22 17:30:50

AI旅游谁在买单?4类B端用户付费率超35%的ROI分析

2025年,我们团队做过一次实验:同一款AI旅游规划产品投放给10000个用户,定价199元每次或2980元每年。整体付费率4.2%,符合行业平均。但拆解后发现,有4类人群的付费率超过35%。这4类人不是最有钱的,不是最年轻…

2026/8/22 17:30:50

动静态库的制作和使用

一、库库本质上是多个.o文件的集合,库就相当于真正的生产车间,比如你用的stdio.h这个头文件,他就相当于使用说明书。二、静态库的制作与使用2.1 简单制作.a 就是linux中的静态库 就是多个.o文件的集合体ar -rc lib库名.a *.o2.2 使用将需要的…

2026/8/22 17:25:50

Python的weekday()一出手,星期几立马现原形

参与编程工作时, 处理日期以及时间属于一项常见且重要的任务, 不管是开展数据分析工作, 还是构建Web应用程序, 又或是开发自动化脚本, 我们时常都需要针对日常时间开展各种各样的操作。的的模块给我们提供了强大且灵活的工具用以处理这些任务, 当中()方法是一个极为实用的函数,…

2026/8/21 13:13:49

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 20:14:07

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/21 15:40:01

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/21 15:40:01

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/22 1:39:53

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…