Javascript v8:访问';外部对象的重写方法;新';js上下文

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

我尝试将一个嵌入式js引擎从一个非常旧的nspr更改为v8,但遇到了一些问题

下面是我想做的:

// 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”的对象,并且具有相同的行为呢

我以前试过很多东西。。。如果有人能帮助我,他将非常受欢迎:-) 祝你今天愉快