如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码

Callback to C++ code if user try to call undefined function of C++ object from JS

本文关键字:C++ 函数 未定义 代码 回调 对象 用户 调用 JS 如果      更新时间:2023-10-16

我正在使用v8::ObjectTemplate为我的C++对象创建一个 V8 包装器。但是在生成此模板的步骤中,我没有有关C++对象的完整类型信息,因此在 JS 运行时,我有 JS 对象,其中包含不完整的函数和属性列表。

现在,如果用户尝试调用我在ObjectTemplate中没有描述的函数,V8 只是在脚本中抛出异常。

有没有办法设置在引发异常之前调用的回调?

此回调应深入搜索用户调用的函数并返回成功找到的执行结果。

//c++
class A{
public:
static int f1(){return 1;}
static int f2(){return 2;}
};
void create_v8_template(){
v8::Local<v8::ObjectTemplate> template_base = v8::ObjectTemplate::New(isolate);
obj_template->Set(v8pp::to_v8(isolate, "f1"), v8::FunctionTemplate::New(isolate, A::f1));
}
//js
a.f1(); //success
a.f2();// throw exception: "a.f2 is not a function". I need that V8 will invoke my callback there instead the exception

无法自动将 JavaScript 方法/属性查找映射到C++方法/属性名称。其中一个原因是常规发布模式C++二进制文件甚至不再包含这些名称。这通常不是问题/限制,因为C++类在编译时是静态已知的,以后无法动态扩展它们。

我可以想到两种没有静态已知类的情况,以及解决它们的相应方法:

如果您知道可能存在的函数的超集,则可以将它们全部注册到ObjectTemplate上,然后在调用方法时,检查它是否实际存在,否则从C++回调返回undefined(或其他任何内容(。这可能很好用,例如,如果你有一组子类,其中任何一个都可以实例化以填充C++对象的角色。

如果你想将任意键/值结构(例如数据库,或从 JSON 解析的东西等(作为对象公开给 JavaScript,在编译时你真的不知道什么是有效的键,那么你可以使用 V8 的拦截器 API。这基本上归结为告诉 V8"每当从这个对象请求任何属性时,首先询问这个回调该属性是否存在"。当然,在拦截器回调中,您需要一种方法来找出该属性(在您的示例中f2(是否存在。