如何访问在 C++ 中创建的动态变量来自 JavaScript? (通过V8绑定)

发布于 2024-09-15 11:56:22 字数 1113 浏览 3 评论 0原文

Google 很好地解释了如何使用可使用的访问器包装 C++ 类方法来自 V8 Javascript 引擎

但是,他们没有提及如何确定将具有这些访问器属性的 JavaScript 对象的名称。

如何告诉 V8 Javascript C++ 类实例(来自示例)的名称是什么?或者,如果它已经有一个名称,那么它是什么?

这两行设置了访问器:

point_templ.SetAccessor(String::New("x"), GetPointX, SetPointX);
point_templ.SetAccessor(String::New("y"), GetPointY, SetPointY);

我假设它们可以在 JavaScript 中像这样使用:

someObject.x = someObject.y * 2;

How do I certain "someObject"是?

我觉得缺少一些代码来完成 C++ 代码与 V8 Javascript 包装器的链接。

例如,在访问静态全局变量的示例代码中,有将访问器函数显式暴露给 V8 JavaScript 的一行:

Handle<ObjectTemplate> global_templ = ObjectTemplate::New();
global_templ->SetAccessor(String::New("x"), XGetter, XSetter);
global_templ->SetAccessor(String::New("y"), YGetter, YSetter);
Persistent<Context> context = Context::New(NULL, global_templ)

Google was nice enough to explain how to wrap C++ class methods with accessors that can be used from the V8 Javascript engine.

However, they don't mention how to determine the name of the JavaScript object that will have these accessor properties available.

How do I tell V8 Javascript what the name of the C++ class instance (from the sample) is? Or if it already has a name, what is it?

These two lines set up the accessors:

point_templ.SetAccessor(String::New("x"), GetPointX, SetPointX);
point_templ.SetAccessor(String::New("y"), GetPointY, SetPointY);

I assume they can be used like this from JavaScript:

someObject.x = someObject.y * 2;

How do I determine what "someObject" is?

I feel there is some code missing that finishes linking the C++ code with the V8 Javascript wrapper.

For example, in the sample code to access static global variables there was a line that explicitly exposed the accessor functions to V8 JavaScript:

Handle<ObjectTemplate> global_templ = ObjectTemplate::New();
global_templ->SetAccessor(String::New("x"), XGetter, XSetter);
global_templ->SetAccessor(String::New("y"), YGetter, YSetter);
Persistent<Context> context = Context::New(NULL, global_templ)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忘年祭陌 2024-09-22 11:56:22

好的,我找到了拼图中缺失的部分:

context->Global()->Set(String::New("p"), obj);

这一行将前面步骤中创建的对象包装器 obj 公开为 V8 JavaScript 的全局上下文,作为对象“p”。我在这里将其命名为“p”,但它可以是任何有效的 JavaScript 标识符。 (来源

OK, I found the missing piece of the puzzle:

context->Global()->Set(String::New("p"), obj);

This line exposes the object wrapper obj created in the previous steps to V8 JavaScript's global context as the object "p." I named it "p" here, but it could be any valid JavaScript identifier. (source)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文