gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:43:48 33 4
gpt4 key购买 nike

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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com