C++ 如何在Google V8中传递ObjectTemplate::New的第二个参数?
我知道如何创建ObjectTemplate,我们可以对它做几件事。但我的问题不是关于那些众所周知的事情 我想知道如何传递第二个参数 正如官方指南所说: 每个函数模板都有一个关联的对象模板。这用于将使用此函数创建的对象配置为其构造函数 ObjectTemplate::New的第二个参数是FunctionTemplate键入的构造函数C++ 如何在Google V8中传递ObjectTemplate::New的第二个参数?,c++,v8,C++,V8,我知道如何创建ObjectTemplate,我们可以对它做几件事。但我的问题不是关于那些众所周知的事情 我想知道如何传递第二个参数 正如官方指南所说: 每个函数模板都有一个关联的对象模板。这用于将使用此函数创建的对象配置为其构造函数 ObjectTemplate::New的第二个参数是FunctionTemplate键入的构造函数 顺便说一句,我知道访问器的用例等等,我只想知道如何使用第二个参数。在V8的API测试中有第二个ObjectTemplate::New参数的示例,位于: 如您所见,无需
顺便说一句,我知道访问器的用例等等,我只想知道如何使用第二个参数。在V8的API测试中有第二个ObjectTemplate::New参数的示例,位于: 如您所见,无需通过FunctionTemplate间接实现属性创建,这就是ObjectTemplate的用途。请参见上面示例中的x和value属性
你提到的那句话是指别的。当您从FunctionTemplate实例化函数时,JavaScript代码可以将该函数用作构造函数。上述ObjectTemplate可用于配置将以这种方式创建的对象。代码显示它与ObjectTemplate::Newisolate相同;因为fun几乎像第二个参数的默认值-Local。那么,如何为它指定一个特定的FunctionTemplate,而不仅仅是一个空的FunctionTemplate?FunctionTemplate在这里仅用于类名?re 1:fun是一个特定的FunctionTemplate,而不仅仅是空的。您可以在此处指定所需的任何函数模板。-re 2:是的,本例仅将其用于类名。我不知道它是否可以用于其他用途。
static Local<ObjectTemplate> New(Isolate *isolate, Local<FunctionTemplate> constructor = Local<FunctionTemplate>());
void Constructor(const FunctionCallbackInfo<Value>& args)
{
// ...
}
Local<FunctionTemplate> _constructor = FunctionTemplate::New(isolate, Constructor);
Local<ObjectTemplate> tpl = ObjectTemplate::New(isolate, _constructor);
void Constructor(const FunctionCallbackInfo<Value>& args)
{
Isolate* isolate = args.GetIsolate();
args.This()->Set(String::NewFromUtf8(isolate, "value"), Number::New(isolate, 233));
args.GetReturnValue().Set(args.This());
}
LocalContext env;
Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate);
v8::Local<v8::String> class_name = v8_str("the_class_name");
fun->SetClassName(class_name);
Local<ObjectTemplate> templ1 = ObjectTemplate::New(isolate, fun);
templ1->Set(isolate, "x", v8_num(10));
templ1->Set(isolate, "value", v8_num(233)); // From your last snippet.
Local<v8::Object> instance1 =
templ1->NewInstance(env.local()).ToLocalChecked();
CHECK(class_name->StrictEquals(instance1->GetConstructorName()));