</pre><span style="white-space:pre"> </span>global->Set(v8::String::NewFromUtf8(GetIsolate(), "SetName"),<span style="white-space:pre"> </span>v8::FunctionTemplate::New(GetIsolate(), MineScript::SetName));<span style="white-space:pre"> </span><span style="white-space:pre"> </span>v8::Handle<v8::Context> context=Context::New(GetIsolate(),NULL,global);<span style="white-space:pre"> </span><span style="white-space:pre"> </span>//context->DetachGlobal();<span style="white-space:pre"> </span>Context::Scope context_scope(context);<span style="white-space:pre"> </span>Handle<Object> result = global->NewInstance();<span style="white-space:pre"> </span>Handle<External> request_ptr = External::New(GetIsolate(),m_pBase);<span style="white-space:pre"> </span>result->SetInternalField(0, request_ptr);<span style="white-space:pre"> </span>context->Global()->Set(v8::String::NewFromUtf8(GetIsolate(), "point"), result);<pre name="code" class="cpp">
这样,在js中直接通过
point.SetName();
就可以调用c++中point对象的SetName()函数了。
但是如何直接在js中创建一个c++对象实例、如何在c++中创建一个js对象呢??
这个就得用到FunctionTemplate了
Handle<FunctionTemplate> minebase_template =
FunctionTemplate::New(GetIsolate(),MinebaseConstructCallback);
minebase_template->SetClassName(v8::String::NewFromUtf8(isolate_,"JsMinebase"));
Handle<ObjectTemplate> minebase_proto = minebase_template->PrototypeTemplate();
minebase_proto->Set(v8::String::NewFromUtf8(GetIsolate(),"SetMinebaseName"), FunctionTemplate::New(GetIsolate(),SetMinebaseName));
Handle<ObjectTemplate> cloudapp_inst = minebase_template->InstanceTemplate();
cloudapp_inst->SetInternalFieldCount(1);
global->Set(v8::String::NewFromUtf8(GetIsolate(),"JsMinebase"), minebase_template);
以上代码就是通过c++在v8引擎中构建一个js的类:JsMinebase,这样就可以在js中直接创建JsMinebase对象了,类似
<pre name="code" class="javascript">var obj=new JsMinebase();
而要在js中创建c++中的类的实例,则通过MinebaseConstructCallback中来进行实现了,在其中既可创建c++中的对象,也可将找到的某个对象封装到obj中
void MinebaseConstructCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (!args.IsConstructCall())
return /*Undefined(pCurMineMgr->isolate)*/;
CMineBase* cloudapp;
if (args.Length()==1)
{
int r = args[0]->Int32Value();
cloudapp = pCurMineMgr->FindMineObjectByID(r);
}
if (args.Length()==2)
{
Handle<Value> arg = args[0];
v8::String::Utf8Value valuename(arg);
cloudapp = pCurMineMgr->FindMineObject("节点",*valuename);
}
Handle<Object> object = args.This();
object->SetInternalField(0, External::New(pCurMineMgr->isolate,cloudapp)/*MakeWeakCloudApp(cloudapp)*/);
}
这样,就达到了在js中创建c++对象的目的,然后就可以调用其函数了,当然,调用的函数也需要进行封装