Javascript v8:访问';外部对象的重写方法;新';js上下文
我尝试将一个嵌入式js引擎从一个非常旧的nspr更改为v8,但遇到了一些问题 下面是我想做的:Javascript v8:访问';外部对象的重写方法;新';js上下文,javascript,c++,v8,Javascript,C++,V8,我尝试将一个嵌入式js引擎从一个非常旧的nspr更改为v8,但遇到了一些问题 下面是我想做的: // C++ class myClass { public: myClass(); static void myClassConstructor(const v8::FunctionCallbackInfo<v8::Value>& args); static void myClass_method1(const v8::FunctionCallbackInf
// C++
class myClass {
public:
myClass();
static void myClassConstructor(const v8::FunctionCallbackInfo<v8::Value>& args);
static void myClass_method1(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Persistent<v8::Function> constructor;
}
void JS_InitmyClass(Isolate *isolate, Local<Object> global) {
v8::Local<v8::FunctionTemplate> f = v8::FunctionTemplate::New(isolate, MyClass::myClassConstructor);
f->SetClassName(v8::String::NewFromUtf8(isolate,"myClass"));
f->InstanceTemplate()->SetInternalFieldCount(1);
f->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "method1"), FunctionTemplate::New(isolate, myClass_method1->GetFunction()));
global->Set(v8::String::NewFromUtf8(isolate,"myClass"), f->GetFunction());
if (myClass::constructor.IsEmpty())
myClass::constructor.Reset(isolate, f->GetFunction());
}
void myClass::myClassConstructor(const v8::FunctionCallbackInfo<v8::Value>& args) {
EscapableHandleScope handle_scope(args.GetIsolate());
myClass* ref = new myClass();
args.This()->SetInternalField(0, External::New(args.GetIsolate(), ref));
args.GetReturnValue().Set(handle_scope.Escape(args.This()));
}
void myClass::myClass_method1(const v8::FunctionCallbackInfo<v8::Value>& args) {
// Here I want to create a new object (outside a 'new' js context) and return it
EscapableHandleScope handle_scope(cx);
myClass *ref = new myClass();
Local<Function> f = Local<Function>::New(cx, myClass::constructor);
Local<Object> newobj = f->NewInstance();
newobj->SetInternalField(0, External::New(cx, ref));
return handle_scope.Escape(newobj);
}
// Js
myClass.prototype.js_method = function () {
}
a = new myClass(); // a is [Object myClass] and got method1 & js_method available
a.js_method(); // ok
b = myClass.method1(); // b is [Object myClass] but only method1 is available
b.js_method(); // not ok
<代码> /C++
类myClass{
公众:
myClass();
静态void myClassConstructor(constv8::FunctionCallbackInfo&args);
静态void myClass_method1(constv8::FunctionCallbackInfo&args);
静态v8::持久构造函数;
}
void JS_InitmyClass(隔离*隔离,局部-全局){
v8::Local f=v8::FunctionTemplate::New(隔离,MyClass::myClassConstructor);
f->SetClassName(v8::String::NewFromUtf8(隔离“myClass”);
f->InstanceTemplate()->SetInternalFieldCount(1);
f->PrototypeTemplate()->Set(字符串::NewFromUtf8(隔离,“方法1”),函数模板::New(隔离,myClass_方法1->GetFunction());
全局->设置(v8::String::NewFromUtf8(隔离,“myClass”),f->GetFunction();
if(myClass::constructor.IsEmpty())
myClass::constructor.Reset(隔离,f->GetFunction());
}
void myClass::myClassConstructor(const v8::FunctionCallbackInfo&args){
EscapableHandleScope句柄(args.GetIsolate());
myClass*ref=新的myClass();
args.This()->SetInternalField(0,外部::新建(args.GetIsolate(),ref));
args.GetReturnValue().Set(handle_scope.Escape(args.This());
}
void myClass::myClass_method1(const v8::FunctionCallbackInfo&args){
//在这里,我想创建一个新对象(在“新”js上下文之外)并返回它
可卸手柄内窥镜手柄内窥镜(cx);
myClass*ref=新的myClass();
Local f=Local::New(cx,myClass::构造函数);
本地newobj=f->NewInstance();
newobj->SetInternalField(0,External::New(cx,ref));
返回句柄\范围转义(newobj);
}
//Js
myClass.prototype.js_方法=函数(){
}
a=新的myClass();//一个是[Object myClass],并且Get method1和js_方法可用
a、 js_方法();//好啊
b=myClass.method1();//b是[Object myClass],但只有method1可用
b、 js_方法();//不好
我知道,对于a,原型已经按照我的要求进行了更改,但是对于b,使用了旧的原型,因此js_方法无法使用。是吗?
那么,我如何在v8中创建一个没有js“new”的对象,并且具有相同的行为呢
我以前试过很多东西。。。如果有人能帮助我,他将非常受欢迎:-)
祝你今天愉快