Как создать геттер в надстройке узла?

Я был в процессе написания надстройки узла и не могу понять, как добавить свойство к классу. Что я делал, так это создавал метод в надстройке c++, а в javascript я создаю геттер, который вызывает функцию из надстройки.

Это правильный способ сделать это или это свойство можно создать в надстройке c++?

В c++ я делаю так:

void MyAddon::Init(Local<Object> exports, Local<Object> module) {

  // Prepare constructor template
  Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New);
  tpl->SetClassName(String::NewFromUtf8(isolate, "MyAddon"));
  tpl->InstanceTemplate()->SetInternalFieldCount(1);

  // Add the property
  NODE_SET_PROTOTYPE_METHOD(tpl, "currWidth", Width);


  // Export the class
  constructor.Reset(isolate, tpl->GetFunction());
  exports->Set(
      String::NewFromUtf8(isolate, "MyAddon"), tpl->GetFunction());
}

Затем в JavaScript делаю так:

const MyAddon = require('./build/Release/MyAddon')

module.exports.Addon = class Addon extends MyAddon.MyAddon {
  get width() { return this.currWidth() }
}

Это не похоже на правильный способ добавления свойства в надстройку. пример на сайте использует NODE_SET_METHOD, поэтому я пробовал, но он не запускает метод. Я тоже не получаю ошибок. Метод просто не работает ...

В этом примере они не пытаются установить его для класса, что я и пытаюсь сделать, поэтому мой немного отличается:

NODE_SET_METHOD((Local<Template>)tpl, "height", Height);

Как я могу создать это свойство в c++?

По поводу вашего ник: пожалуйста, держитесь подальше от моего!

πάντα ῥεῖ 13.09.2018 21:22

Вы должны иметь возможность сделать это, используя v8::ObjectTemplate::SetAccessor, предоставляющий функции обратного вызова геттера и сеттера, которые будут вызываться при доступе к соответствующему свойству объекта.

user7860670 13.09.2018 21:31

Спасибо VTT, не могли бы вы привести пример?

Get Off My Lawn 13.09.2018 21:38
1
3
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В методе Init это было так же просто, как добавить эту строку:

tpl->InstanceTemplate()->SetAccessor(String::NewFromUtf8(isolate, "width"), Width);

И создадим метод, который выглядит так:

void MyAddon::Width(Local<String> property, const PropertyCallbackInfo<Value> &args) {}

Другие вопросы по теме