как соотносить ценность и функцию без ОО - PullRequest
1 голос
/ 18 декабря 2011

Моя функция init возвращает v8::Handle<Object>, и это Object содержит несколько Handle<Function> свойств, например bar.

var foo = require('foo').init({a:'a', b:'b'});
foo.bar('a');

В моем коде дополнения:

Handle<Object> Bar (Arguments &args) {
  // !! how to access mystruct* p for current call?
}

Handle<Object> Init(Arguments &args) {
  HandleScope scope;
  mystruct* p = InitMyStructWithArgs(args);
  Object ret;
  // !! how to bind mystruct* p to Bar?
  NODE_SET_METHOD(ret, 'bar', Bar);
  scope.Close(ret);
}

Вы видите, что Бар, Obj, все аргументы автономны, между ними нет родственников, поэтому я не могу получить mystruct*, который инициализируется {a:'a', b:'b'} в Bar

1 Ответ

2 голосов
/ 05 мая 2012

Пример

Вам необходимо связать свои пользовательские объекты c ++ через SetPointerInInternalField с вашими возвращенными объектами.

Затем вы можете получить доступ к вашим объектам c ++ через GetPointerFromInternalField из ваших объектных функций.

C ++

#include <v8.h>
#include <node.h>

using namespace v8;
using namespace node;

namespace {

struct Sample {
  int counter;
};

Handle<Value> Add(const Arguments& args) {
  HandleScope scope;

  Sample *sample = static_cast<Sample*>(args.This()->GetPointerFromInternalField(0));

  return scope.Close(Number::New(sample->counter));
}

Handle<Value> Init(const Arguments& args) {
  HandleScope scope;

  Sample* sample = new Sample();
  sample->counter = 5;

  Local<ObjectTemplate> objectTemplate = ObjectTemplate::New();
  objectTemplate->SetInternalFieldCount(1);

  Local<Object> ret = objectTemplate->NewInstance();

  ret->SetPointerInInternalField(0, sample);
  ret->Set(String::New("add"), FunctionTemplate::New(Add)->GetFunction());

  return scope.Close(ret);
}

extern "C" void init(Handle<Object> target) {
  HandleScope scope;

  target->Set(String::New("init"), FunctionTemplate::New(Init)->GetFunction());
}

} // anonymous namespace

JavaScript

var foo = test.init();
console.log(foo.add());  // 5

Ссылка

http://izs.me/v8-docs/classv8_1_1ObjectTemplate.html

...