除了上文说的全局函数,我们还可以创建类函数。
虽然我使用JS很少,但是就我感觉,函数和对象其实就是一个东西的两种表现。函数是一种特殊的对象,创建的时候,需要进行一些操作,返回的值不是函数对象,而是指定的其他东西。
希望动态创建一个对象,自然首先想到应该使用ObjectTemplate。同时,也可以发现这个类中有SetInternalFieldCount,而Object中有SetInternalField。这两个方法,就用来传递C++代码中的对象实例指针给一个JS的Object。然后再将一个FunctionTemplate添加进入ObjectTemplate。这个FunctionTemplate对应的C函数,从传入的参数中取得前面传递的对象,然后进行对应操作。其实V8仅仅维护的是一个指针,所以我传入Objective-C的类指针,访问也没什么问题。不过引用计数管理内存应该会有问题吧。暂时还找不到应该何时去调用release,就先泄露着吧。
Handle<ObjectTemplate> mars_obj_templ = ObjectTemplate::New();
mars_obj_templ->Set("backToMars", FunctionTemplate::New(backToMars));
mars_obj_templ->SetInternalFieldCount(1);
Local<Object> obj = mars_obj_templ->NewInstance();
V8Mars* mars = [[V8Mars alloc] init];
mars.name = @"earth";