official examples暴露一个 Point 类似乎假设在你的程序中会有固定数量的实例。当在 Javascript 中调用 new 时,尚不清楚如何在 C++ 代码中分配新实例。
如何公开一个可以有多个实例的类?例如,一个 Image 类:
var img1 = new Image( 640, 480 );
var img2 = new Image( 1024, 768 );
img1.clear( "red" );
img2.clear( "black" );
最佳答案
这是最好的blog post I could find on exposing C++ objects to V8 Javascript .它深入细节,并使用代码片段将其分解为更小的步骤。请注意:代码片段几乎没有不一致之处,我读了几遍才明白。事先阅读我的简短摘要可能会有所帮助:
- 对象必须包装在 V8 模板中。 注意:Google 示例使用 ObjectTemplates,但作者解释了为什么他更喜欢 FunctionTemplates。
- 创建一个函数模板。此模板的实例有一个内部字段来存储 C++ 对象的内存地址。他们还获得类的访问器方法。
- 创建一个函数 wrapObject(),它将 C++ 对象包装在这些 FunctionTemplate 之一中。
- 构造函数还必须包装在(不同的)V8 模板中。使用不同的模板来避免不必要的递归。 (将两个模板合并为一个的方法在博文末尾描述。)
- 创建另一个 FunctionTemplate。该模板只是将 JavaScript 全局作用域(将调用
new
的地方)连接到 C++ 构造函数。 - 制作模板将调用的方法。该方法实际上使用了 C++
new
运算符,并调用了 C++ 类的构造函数。然后它通过调用在步骤 1.2 中创建的 wrapObject() 方法来包装对象。
- 创建另一个 FunctionTemplate。该模板只是将 JavaScript 全局作用域(将调用
现在,在步骤 2.2 中分配的内存必须删除
一段时间。 更新:下一篇博文“Persistent Handles”详细介绍了这一点。
我在 actual code alluded to in these blog posts 上的笔记:
- 博客中的
wrapPoint()
方法其实类似于实际代码中的unwrap()
方法; 不是wrap()
- 要查找代码之间的其他共同点,请搜索:
SetInternalFieldCount(0
,constructorCall
- 实际代码似乎是通过使用 MakeWeak() 方法来设置执行清理的回调方法来进行内存管理的。
关于javascript - 如何在 V8 Javascript 引擎中公开一个 C++ 类,以便可以使用 new 创建它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3066833/