1、_JSinternalStruct结构的析构函数调用if (o)
JS_SetPrivate(NULL,o,
NULL);会出错,具体原因不了解,大家可以讨论一下。(我现在暂时去掉了)
2、如果想在C++生成好对象,然后用JS_DefineProperty设置给Script使用,则这个对象必须用new生成,且不可以delete。问题出在,用JS_DefineProperty的时候调用了getJSObject,则会将this设置在Private中,在对象消失的时候,会在JSDestructor中被delete掉,所以不可以用实例。如果这个对象需要保存(对于使用状态机的机制,这个是必须的)则必须先生成一个临时变量,然后将这个对象copy到临时变量中,运行完后,在讲这个临时变量copy到对象中,这样可以避免被JSDestructor
delete掉。这样是否会有效率问题?有没有更好的方法?
3、对于多线程的使用是否对于JS函数的调用都要用JS_BeginRequest
和 JS_EndRequest包含起来?
JSBool Customer::clearReference(JSContext *cx){
if(!_JSinternal.o || !cx) return JS_FALSE;
return JS_SetPrivate(cx, _JSinternal.o, NULL);
}
在删除对象或对象实例失效前调用这个函数。
这样自己new的类就可以自己delete了,同时也可以支持实例了。
还有一个问题:如果是在js外生成对象,然后通过JS_DefineProperty设置给Script使用,则要设置这个属性为:JSPROP_ENUMERATE|JSPROP_PERMANENT,从而避免被GC收集。如果不用JSPROP_PERMANENT,则调用JS_GC()的
时候会被调用JSDestructor(),这样也会将this删除掉。
1、对于线程安全的使用。
2、GC的垃圾回收
3、C++和JS间的对象共享
我前面给出的一些经验未必正确,希望大家多给建议!!
对于提出的问题同时希望大家能找找答案,谢谢!