Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性

Nan::ObjectWrap to Napi::Object Wrap can't access to properties in JavaScript

本文关键字:JavaScript 访问 属性 Wrap to ObjectWrap Napi Object Nan      更新时间:2023-10-16

我已经将代码从Nan修改为Napi(C++插件(。此代码使用ObjectWrap类。在使用Nan之前,当我试图获得节点插件返回的对象的属性时,它是有效的。

console.log(Object.keys(result)); 
[ 'bool', 'string', 'int', 'float', 'vtype' ]

现在,使用Napi,当我尝试相同的命令时,我会得到:

[]

但对房产的访问仍在继续:

console.log(result.bool);
false

我的初始化代码:

Napi::Object JSVariant::Init(Napi::Env env, Napi::Object exports)
{
Napi::HandleScope scope(env);
Napi::Function ctor = DefineClass(env, "JSVariant", {InstanceAccessor("vtype", &JSVariant::GetVTypeValue, &JSVariant::SetVTypeValue), InstanceAccessor("float", &JSVariant::GetFltValue, &JSVariant::SetFltValue), InstanceAccessor("int", &JSVariant::GetIntValue, &JSVariant::SetIntValue), InstanceAccessor("string", &JSVariant::GetStringValue, &JSVariant::SetStringValue), InstanceAccessor("bool", &JSVariant::GetBoolValue, &JSVariant::SetBoolValue)});
constructor = Napi::Persistent(ctor);
constructor.SuppressDestruct();
exports.Set("JSVariant", ctor);
return exports;
}

有没有办法用纳皮得到楠的结果?

我不知道你原来的Nan代码看起来怎么样,但

  • Object.keys无法使用prototype对象中的属性,这正是您正在执行的操作
  • InstanceAccessor有一个可选的第四个参数,它采用napi_propety_attributes值,您必须将其设置为napi_enumerable才能使属性可见,但只有在Object.keys(Object.getPrototypeOf(obj))中才会如此