javascript - 在 Nan::ObjectWrap C++ 类中存储 JavaScript 实例的正确方法

标签 javascript c++ node.js node.js-addon node.js-nan

假设我有两个用 C++ 开发的类,但使用 Nan NodeJS native 模块公开。例如,“Sprite”和“Texture”类。

在 JavaScript 中,我希望能够让 Sprite 存储纹理,就像它只是另一个属性一样:

// Local instance of texture
var t = new Texture();

// Global instances of Sprites that won't be GC'd
global.spr = new Sprite();
global.spr2 = new Sprite();

// Same texture can be assigned to multiple sprites
spr.texture = t;
spr2.texture = t;

console.log(spr.texture);

在 C++ 方面,Sprite 的“纹理”属性将是存储或检索纹理的 Getter/Setter。但问题是,在内部存储 Texture 实例的正确方法是什么(来自提供的 v8::Local)?比如,我需要做些什么才能将它注册为 Sprite“拥有”并使其不会像上面的示例中那样得到 GC?

最佳答案

您可以将 Persistent 句柄作为存储 Texture 实例的 Sprite 类的成员。 Sprite 析构函数需要重置句柄以避免泄漏。

class Sprite : public Nan::ObjectWrap {
public:
  Nan::Persistent<v8::Object> textureHandle;

  static NAN_SETTER(SetTexture) {
    Sprite* sprite = Nan::ObjectWrap::Unwrap<Sprite>(info.This());
    if (Nan::New(Texture::constructor)->HasInstance(value)) {
      sprite->textureHandle.Reset(value);
    } else {
      // value wasn't a Texture instance; do something
    }
  }

  static NAN_GETTER(GetTexture) {
    Sprite* sprite = Nan::ObjectWrap::Unwrap<Sprite>(info.This());
    Isolate* iso = Isolate::GetCurrent();
    if (sprite->textureHandle.IsEmpty()) {
      // Texture hasn't been set yet; do something
    } else {
      info.GetReturnValue().Set(sprite->TextureHandle.Get(iso));
    }
  }

  ~Sprite() {
    textureHandle.Reset();
  }
}

(未显示:注册 getter/setter 的初始化代码。)

关于javascript - 在 Nan::ObjectWrap C++ 类中存储 JavaScript 实例的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53708658/

相关文章:

c++ - 如何创建一个新值并分配给类构造函数中的私有(private) unique_ptr?

javascript - 如何使用变量args调用类方法

javascript - 为什么 Microsoft Graph 列表订阅会返回原来的内容?

node.js - Node 客户端 session 与快速 session

javascript - 为什么 this 在这两种情况下引用的关键字不同?

javascript - 我的谷歌地图 DIV 位于其他所有内容之上 - 不明白为什么

javascript - 如果用户发送另一个请求,请使用 .abort() 取消现有的 ajax 请求

c# - 让 C# 和 C++ 一起玩得很好

c++ - 可以放入命名空间的完整法律实体有哪些?

javascript - 当我输入一个 £ 符号时,使用 jQuery 输出 html 会创建一个随机的 'Â'