gpt4 book ai didi

javascript - 使用 JavascriptCore 创建构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:02:39 26 4
gpt4 key购买 nike

当使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com