首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >duktape公开c++对象(方法+属性)

duktape公开c++对象(方法+属性)
EN

Stack Overflow用户
提问于 2016-05-02 00:19:19
回答 1查看 1.8K关注 0票数 2

我正在尝试将我的对象导出到javascript,但是我仍然不知道如何绑定属性"getter“和"setter”。a.g:

代码语言:javascript
复制
class MyObjectWrapper : public MyObject
{
public:
   void MethodToBind() { ... };

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

当我的引擎在外部操作对象属性时,我想我不应该将它设置为“常量”。我想将这两个方法绑定为setter和getter,这样当执行上面的脚本时,它将调用这些方法:

代码语言:javascript
复制
object.Method(); // call MethodToBind
object.Property = "Hello World!"; // call PropertySetter
printf(Object.Property + '\n'); // call PropertyGetter

这可以通过duktape来实现吗?每次我的引擎从c++代码外部改变属性值时,我必须更新javascript堆中的值吗?

EN

回答 1

Stack Overflow用户

发布于 2016-05-21 02:42:26

Duktape/C函数通常有一个原型

代码语言:javascript
复制
int my_func(duk_context *) 

因此,我认为您应该保留已定义的用于从C++ (MethodToBind、PropertySetter/Getter)访问对象的函数,并添加私有方法

代码语言:javascript
复制
...
private:
    String Property;
    int duk_method(duk_context *ctx);
    int duk_setter(duk_context *ctx);
    int duk_getter(duk_context *ctx);
};

并将它们实现为(如果缺少一些细节,很抱歉,我不是C++的人)

代码语言:javascript
复制
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的对象,则可以调用

代码语言:javascript
复制
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代码能够使用

代码语言:javascript
复制
my_object = new MyObject();

您需要在本机构造函数中执行上述操作,如下所述:https://github.com/svaarala/duktape-wiki/blob/master/HowtoNativeConstructor.md

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36968914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档