回调到C++;如果用户试图调用C+;的未定义函数,则执行此代码+;来自JS的对象 我用C++代码> v8::ObjistMase< /Cuff>创建了一个V8包装器。但是在生成此模板的步骤中,我没有关于C++对象的完整类型信息,因此JS运行时的JS对象具有不完整的函数和属性列表。

回调到C++;如果用户试图调用C+;的未定义函数,则执行此代码+;来自JS的对象 我用C++代码> v8::ObjistMase< /Cuff>创建了一个V8包装器。但是在生成此模板的步骤中,我没有关于C++对象的完整类型信息,因此JS运行时的JS对象具有不完整的函数和属性列表。,c++,v8,C++,V8,现在,若用户尝试调用一个我在ObjectTemplate中并没有描述的函数,V8只会在脚本中抛出一个异常 有没有办法设置在抛出异常之前调用的回调 这个回调应该深入搜索用户调用的函数,并返回它成功找到的执行结果 /c++ 甲级{ 公众: 静态int f1(){return 1;} 静态int f2(){return 2;} }; void创建_v8_模板(){ v8::Local template_base=v8::ObjectTemplate::New(隔离); obj_模板->设置(v8pp:

现在,若用户尝试调用一个我在
ObjectTemplate
中并没有描述的函数,V8只会在脚本中抛出一个异常

有没有办法设置在抛出异常之前调用的回调

这个回调应该深入搜索用户调用的函数,并返回它成功找到的执行结果

/c++
甲级{
公众:
静态int f1(){return 1;}
静态int f2(){return 2;}
};
void创建_v8_模板(){
v8::Local template_base=v8::ObjectTemplate::New(隔离);
obj_模板->设置(v8pp::to_v8(隔离,“f1”),v8::FunctionTemplate::New(隔离,A::f1));
}
//js
a、 f1()//成功
a、 f2();//抛出异常:“a.f2不是函数”。我需要V8在那里调用我的回调,而不是异常

> > P>无法自动将JavaScript方法/属性查找映射到C++方法/属性名。原因之一是,常规发布模式C++二进制文件甚至不再包含这些名称。这通常不是问题/限制,因为C++类在编译时是静态已知的,它们不能在以后动态地扩展。 我可以想到两种情况,其中没有静态已知的类,以及相应的解决方法:

如果你知道可能存在的函数的超集,你可以将它们全部登记在ObjtTease>代码>,然后调用一个方法,检查它是否真的存在,否则从C++回调中返回<代码>未定义< /C> >(或任何东西)。这可能会很好地工作,例如,如果你有一个子类,其中任何一个子类都可以被实例化来填充C++对象的角色。


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

考虑提供一个,因此,你也可以在C++中同时进入<代码>获取< /代码>进程。