javascript - 使用 JavascriptCore 创建构造函数

标签 javascript ios objective-c c xcode

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

相关文章:

javascript - 如果我将相同的事件附加到相同的元素会发生什么?

ios - 将测试目标的 'Host Application' 设置为 None,然后无法找到捆绑资源

objective-c - 实现预定义类的最常用方法。

ios - 在 CoreData 的 fetchedObjects 中编辑多个对象

javascript - 无法从本地主机中的 php 文件获取 json 数据

javascript - 样式化组件 – 从父级访问 props

javascript - 将 jQuery 与切换事件结合使用

ios - 扩展图像上的捏合手势识别器

iphone - 向 UITableView 上的 UIImageView 添加阴影会降低性能……为什么?

iphone - 我可以在应用程序再次激活后重新启动它吗?