javascript - duktape 公开 C++ 对象(方法 + 属性)

标签 javascript c++ duktape

我正在尝试将对象导出到 JavaScript,但我仍然不知道如何绑定(bind)属性“getter”和“setter”。例如:

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

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

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

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

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

最佳答案

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

int my_func(duk_context *) 

所以我认为你应该做的是保留你定义的从 C++ 访问对象的函数(MethodToBind、PropertySetter/Getter)并添加私有(private)方法

...
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();

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

关于javascript - duktape 公开 C++ 对象(方法 + 属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968914/

相关文章:

c++ - 构造可变参数模板参数列表

多个字段的javascript字段计算

C++ typeof 运算符

c++ - 使用 Crypto++ 库仅从 x 压缩坐标中检索 ECDSA 公钥

c++ - C++ 中的矩阵库与 For 循环

c++ - 迭代 Duktape 中的未知对象

javascript - 尝试使用 AsyncStorage 时应用崩溃

javascript - 在 src-attribute 中加载带有可变参数的 JavaScript

javascript - 如何允许我的用户在 Cognito 用户池上重置密码?

go-duktape 调用函数的例子