javascript — duktape, представляющий объект c ++ (методы + свойства)

Я пытаюсь экспортировать свои объекты в javascript, но я все еще не понимаю, как связать свойство «getter» и «setter». a.g:

class MyObjectWrapper : public MyObject
{
public:
void MethodToBind() { ... };

void PropertySetter(String& s) { Property = s; }
String& PropertyGetter() { return Property; }
private:
String Property;
};

Поскольку мой движок манипулирует свойством объекта извне, я не должен устанавливать его как «константу», я думаю. Я хотел бы связать эти 2 метода как установщик и получатель, чтобы при выполнении скрипта, подобного приведенному выше, он вызывал эти методы:

object.Method(); // call MethodToBind
object.Property = "Hello World!"; // call PropertySetter
printf(Object.Property + '\n'); // call PropertyGetter

Это возможно через дуктапе? Нужно ли обновлять значение в куче javascript каждый раз, когда мой движок будет изменять значение свойства извне из кода C ++?

1

Решение

Функции Duktape / C обычно имеют прототип

int my_func(duk_context *)

поэтому я думаю, что вам следует сохранить определенные вами функции для доступа к вашему объекту из C ++ (MethodToBind, PropertySetter / Getter) и добавить частные методы

...
private:
String Property;
int duk_method(duk_context *ctx);
int duk_setter(duk_context *ctx);
int duk_getter(duk_context *ctx);
};

и реализовать их как (извините, если некоторые детали отсутствуют, я не C ++ парень)

int MyObjectWrapper::duk_method(duk_context *ctx) {
MethodToBind();
return 0; //no args and no return value, no need to act on JS stack
}

int MyObjectWrapper::duk_setter(duk_context *ctx) {
Property = new String(duk_get_string(ctx, 0)); //first arg to String
return 0;
}

int MyObjectWrapper::duk_getter(duk_context *ctx) {
duk_push_string(ctx, Property.c_str());
return 1; //we pushed one return value
}

Теперь, если у вас есть объект на вершине стека значений Duktape JS, который вы хотите превратить в MyObject, вы вызываете

duk_push_string(ctx, "Property");
duk_push_c_function(ctx, MyObjectWrapper::duk_getter, 0 /*nargs*/);
duk_push_c_function(ctx, MyObjectWrapper::duk_setter, 1 /*nargs*/);
duk_def_prop(cx, -4, DUK_DEFPROP_HAVE_GETTER|DUK_DEFPROP_HAVE_SETTER);
duk_push_c_function(ctx, MyObjectWrapper::duk_method, 0 /*nargs*/);
duk_put_prop_string(ctx, -2, "Method");

Если вы хотите, чтобы код JS мог создавать такой объект с

my_object = new MyObject();

Вы должны сделать выше в собственном конструкторе, как описано здесь:
https://github.com/svaarala/duktape-wiki/blob/master/HowtoNativeConstructor.md

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]