Google V8中ObjectTemplate::New的第二个参数如何传递?
How to pass the second parameter of ObjectTemplate::New in Google V8?
我知道创建一个 ObjectTemplate,我们可以对它做几件事。不过我问的不是那些众所周知的东西
我想知道第二个参数怎么传
正如官方指南所说:
Each function template has an associated object template. This is used to configure objects created with this function as their constructor.
而ObjectTemplate::New的第二个参数是FunctionTemplate
类型的构造函数。
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);
谁能给我一个如何实现Constructor
功能的demo
我试过了,但失败了:
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());
}
顺便说一句,访问器的用例等等我都知道,我只想知道第二个参数怎么用
在 V8 的 API 测试中有第二个 ObjectTemplate::New
参数的示例 https://chromium.googlesource.com/v8/v8/+/master/test/cctest/test-api.cc#1901:
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()));
如您所见,无需通过 FunctionTemplate
间接实现 属性 创建,这就是 ObjectTemplate
的用途。请参阅上例中的 "x" 和 "value" 属性。
你提到的引述指的是别的东西。当您从 FunctionTemplate
实例化一个函数时,JavaScript 代码可以将该函数用作构造函数。提到的 ObjectTemplate
可用于配置将以这种方式创建的对象。
我知道创建一个 ObjectTemplate,我们可以对它做几件事。不过我问的不是那些众所周知的东西
我想知道第二个参数怎么传
正如官方指南所说:
Each function template has an associated object template. This is used to configure objects created with this function as their constructor.
而ObjectTemplate::New的第二个参数是FunctionTemplate
类型的构造函数。
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);
谁能给我一个如何实现Constructor
功能的demo
我试过了,但失败了:
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());
}
顺便说一句,访问器的用例等等我都知道,我只想知道第二个参数怎么用
在 V8 的 API 测试中有第二个 ObjectTemplate::New
参数的示例 https://chromium.googlesource.com/v8/v8/+/master/test/cctest/test-api.cc#1901:
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()));
如您所见,无需通过 FunctionTemplate
间接实现 属性 创建,这就是 ObjectTemplate
的用途。请参阅上例中的 "x" 和 "value" 属性。
你提到的引述指的是别的东西。当您从 FunctionTemplate
实例化一个函数时,JavaScript 代码可以将该函数用作构造函数。提到的 ObjectTemplate
可用于配置将以这种方式创建的对象。