3

在javascript中,我试图运行的代码是

const Element = require("element.node");
let element = new Element();
console.log(element.parent); // null
element.parent = element;
console.log(element.parent === element); // should be true

所以在 cpp Element 类中我有

void Element::SetParent(const Napi::CallbackInfo &info, const Napi::Value &value) {
    this->parent = Element::Unwrap(info[0].As<Napi::Object>());
}

但我不知道如何实现 GetParent 方法,this->parent 具有正确的指针,但我在互联网上找到的所有示例都创建了一个新的 c++ Element 实例,调用 js 构造函数来拥有一个 Napi::Object

我可以调用一些方法来反转 Element::Unwrap 吗?

喜欢

Napi::Value Element::GetParent(const Napi::CallbackInfo &info) {
    Napi::Env env = info.Env();
    if (this->parent == NULL) {
        return env.Null();
    }
    return Napi::Object::Wrap(this->parent);
}
4

1 回答 1

0

不要解开 JS 对象。保留一个指向 JS 对象的持久引用的共享指针:

this->parent =
  std::make_shared<Napi::Reference<Napi::Object>>(Napi::Persistent(info[0].As<Napi::Object()>));

使用共享指针将负责在对象被销毁时销毁持久引用 - 否则您将获得内存泄漏。

this->parent应该是一个Napi::Reference<Napi::Object>

或者

一个更简单的解决方案是将此操作委托给 JS 胶水 - 所有严肃的插件都有一个 JS 包装器,它执行在 JS 中比在 C++ 中更容易的操作。

于 2022-01-21T18:36:08.100 回答