从 JS (V8) 中C++对象的引用调用函数
Call function from reference of C++ Object in JS (V8)
我有下一个JS代码:
my_cpp_object.my_function(); // Works fine
var func = my_cpp_object.my_function;
func(); // Error, callback have not pointer to C++ object
此代码在理论上应该可以正常工作。但不是以防my_cpp_object
是我通过v8::ObjectTemplate
和v8::Context::Set()
创建的对象,因为我通过这种方式添加到上下文中的对象存储指向C++对象实例的指针。 当我调用my_cpp_object.my_function()
时,它会调用一个带有const v8::FunctionCallbackInfo<v8::Value>&
参数的回调函数,该参数具有指向C++对象的指针。
但是当我调用func((时,它也调用了一个带有const v8::FunctionCallbackInfo<v8::Value>&
参数的回调,但没有指向C++对象的指针(args.Holder().As<v8::Object>()->InternalFieldCount() == 0
是否可以解决此问题?
这段代码理论上应该可以正常工作
不幸的是,没有。 在 JavaScript 中,拥有一个接收器对于方法调用很重要。您可以将其视为隐式的第一个参数。将对象的方法分配给变量会"丢失"接收器。换句话说,func
变量不记得它是从my_cpp_object
加载的,所以func()
调用无法将指向该对象的指针与调用一起传递。考虑这个纯JavaScript示例:
var o = {
x: 42,
get: function() { return this.x; }
}
o.get(); // 42
var func = o.get;
func(); // undefined
(你得到undefined
的原因是因为在func()
调用中,全局对象将隐式地成为接收方,所以.x
加载将从中加载一个不存在的属性,所以你会得到undefined
。
简而言之,如果您的C++定义方法依赖于args.Holder
或args.Receiver
(或者如果您的 JavaScript 定义方法以任何方式依赖于this
(,则调用必须具有正确的接收器。
任何解决方案都必须发生在 JavaScript 端。如果您需要一种仅存储单个函数的方法,则可以创建一个闭包来捕获接收器:
var func = function() { return my_cpp_object.my_function(); }
func(); // Works fine.
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则