Node.js C++ 使用 Local<Value> 构建 JS 对象并调用函数
首先,需要包含以下头文件:
#include <node.h>
#include <v8.h>
然后,可以使用以下代码创建一个包含{x: 1, y: 2, type: 3}的JavaScript对象:
v8::Local<v8::Object> obj = v8::Object::New(isolate);
obj->Set(context, v8::String::NewFromUtf8(isolate, 'x'), v8::Number::New(isolate, 1));
obj->Set(context, v8::String::NewFromUtf8(isolate, 'y'), v8::Number::New(isolate, 2));
obj->Set(context, v8::String::NewFromUtf8(isolate, 'type'), v8::Number::New(isolate, 3));
其中,isolate是一个Isolate对象,可以通过args.GetIsolate()获取;context是一个Local<Context>对象,可以通过args.GetIsolate()->GetCurrentContext()获取。
接下来,可以使用以下代码调用一个JavaScript函数:
v8::Local<v8::Function> func = ...; // 获取要调用的函数
v8::Local<v8::Value> result = func->Call(context, context->Global(), 1, &obj);
其中,func是一个Local<Function>对象,可以通过以下代码获取:
v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(args[0]);
这里假设函数是作为参数传递进来的。
完整的示例代码如下:
#include <node.h>
#include <v8.h>
void CallFunction(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate();
v8::Local<v8::Context> context = isolate->GetCurrentContext();
// 创建一个包含{x: 1, y: 2, type: 3}的JavaScript对象
v8::Local<v8::Object> obj = v8::Object::New(isolate);
obj->Set(context, v8::String::NewFromUtf8(isolate, 'x'), v8::Number::New(isolate, 1));
obj->Set(context, v8::String::NewFromUtf8(isolate, 'y'), v8::Number::New(isolate, 2));
obj->Set(context, v8::String::NewFromUtf8(isolate, 'type'), v8::Number::New(isolate, 3));
// 调用JavaScript函数
v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(args[0]);
v8::Local<v8::Value> result = func->Call(context, context->Global(), 1, &obj);
// 将结果返回给JavaScript
args.GetReturnValue().Set(result);
}
void Init(v8::Local<v8::Object> exports, v8::Local<v8::Value> module, void* priv) {
NODE_SET_METHOD(exports, "callFunction", CallFunction);
}
NODE_MODULE(addon, Init)
这个模块暴露了一个名为callFunction的函数,可以接受一个JavaScript函数作为参数,并调用它。在JavaScript中,可以这样使用:
const addon = require('./addon');
function myFunction(obj) {
console.log(obj.x, obj.y, obj.type);
}
addon.callFunction(myFunction);
原文地址: https://www.cveoy.top/t/topic/os8y 著作权归作者所有。请勿转载和采集!