如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
Callback to C++ code if user try to call undefined function of C++ object from JS
我正在使用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
(是否存在。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗