如何传递 ObjectTemplate::New in Google V8 的第二个参数

How to pass the second parameter of ObjectTemplate::New in Google V8?

本文关键字:V8 第二个 参数 Google in 何传递 ObjectTemplate New      更新时间:2023-10-16

我知道创建一个ObjectTemplate,我们可以对它做几件事。但我的问题不是关于那些众所周知的事情。

我想知道如何传递第二个参数。

正如官方指南所说:

每个函数模板都有一个关联的对象模板。这用于配置使用此函数创建的对象作为其构造函数。

而 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功能。

我试过这个,但失败了:

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 测试中,有一个 https://chromium.googlesource.com/v8/v8/+/master/test/cctest/test-api.cc#1901 的第二个 ObjectTemplate::New 参数示例:

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可用于配置将以这种方式创建的对象。

相关文章: