我正在尝试将我的对象导出到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;
};
当我的引擎在外部操纵对象属性时,我不应该将它设置为“常量”。我想将这两个方法绑定为setter和getter,这样当执行上面的脚本时,它将调用这些方法:
object.Method(); // call MethodToBind
object.Property = "Hello World!"; // call PropertySetter
printf(Object.Property + '\n'); // call PropertyGetter
这可以通过duktape吗?每次我的引擎从c ++代码外部更改属性值时,是否必须更新javascript堆中的值?
答案 0 :(得分:2)
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