javascript - 如何在 V8 Javascript 引擎中公开一个 C++ 类,以便可以使用 new 创建它?

标签 javascript c++ v8

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 .它深入细节,并使用代码片段将其分解为更小的步骤。请注意:代码片段几乎没有不一致之处,我读了几遍才明白。事先阅读我的简短摘要可能会有所帮助:

  1. 对象必须包装在 V8 模板中。 注意:Google 示例使用 ObjectTemplates,但作者解释了为什么他更喜欢 FunctionTemplates。
    1. 创建一个函数模板。此模板的实例有一个内部字段来存储 C++ 对象的内存地址。他们还获得类的访问器方法。
    2. 创建一个函数 wrapObject(),它将 C++ 对象包装在这些 FunctionTemplate 之一中。
  2. 构造函数还必须包装在(不同的)V8 模板中。使用不同的模板来避免不必要的递归。 (将两个模板合并为一个的方法在博文末尾描述。)
    1. 创建另一个 FunctionTemplate。该模板只是将 JavaScript 全局作用域(将调用 new 的地方)连接到 C++ 构造函数。
    2. 制作模板将调用的方法。该方法实际上使用了 C++ new 运算符,并调用了 C++ 类的构造函数。然后它通过调用在步骤 1.2 中创建的 wrapObject() 方法来包装对象。

现在,在步骤 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/

相关文章:

javascript - Node.js/v8 : How to make my own snapshot to accelerate startup

javascript - 如何在 AngularJS 中更改 $scope 中的 URL?

Javascript setCustomValidity 不适用于 Chrome 版本 65

javascript - 如何从响应数组中获取对象数组值

c++ - 更改 #include 文件名以匹配大小写

javascript - 查找未处理的 promise 拒绝 : TypeError: Chaining cycle detected for promise 的来源

javascript - 在 LocalStorage 中存储用户定义的 JavaScript 对象并将它们作为用户定义的对象类型检索

c++ - 从函数应用创建 std::vector

c++ - 为什么 XGetWindowProperty 返回 null?

javascript - V8 如何优化超大数组的创建?