当使用 JavascriptCore API
时,我不确定如何通过 new
语法从 Javascript 创建 Objective-C 对象的新实例 (例如。 var x = new MyAwesomeClass())
。传入符合 JSExport-derived protocol
的 Objective-C 类时,在 Javascript 中创建的构造函数对象似乎应该可以作为构造函数调用,但事实并非如此。
例如,假设我删除了一个符合 JSExport-derived protocol
的类,然后将其插入到 javascript 上下文中:
@protocol MyAwesomeClassExports <JSExport>
...
@end
@interface MyAwesomeClass : NSObject <MyAwesomeClassExports>
...
@end
JSContext *context = ...;
context[@"MyAwesomeClass"] = [MyAwesomeClass class]
然后,如果我尝试通过如下语法在 javascript 中创建一个新实例:
[object MyAwesomeClassConstructor] is not a constructor
是否可以使用 new
语法从 javascript 创建 Objective-C 对象的新实例?我最理想的是让它 alloc
然后在我的 Objective-C 实例上调用 init
方法。如果在 javascript 中传递了任何参数,那么这些参数有望通过 [JSContext currentArguments] 类方法在 Objective-C init
方法中访问。
最佳答案
这就是我一直在使用的。希望这对您有所帮助!
extern void RHJSContextMakeClassAvailable(JSContext *context, Class class){
NSString *className = NSStringFromClass(class);
context[[NSString stringWithFormat:@"__%@", className]] = (id) ^(void){ return [[class alloc] init]; };
[context evaluateScript:[NSString stringWithFormat:@"var %@ = function (){ return __%@();};", className, className]];
//allow a class to perform other setup upon being loaded into a context.
SEL selector = NSSelectorFromString(@"classWasMadeAvailableInContext:");
if ([class respondsToSelector:selector]){
((void (*)(id, SEL, JSContext*))[class methodForSelector:selector])(class, selector, context);
}
}
关于javascript - 使用 JavascriptCore 创建构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20113799/