2017-04-07 112 views
0

我在我的应用中使用JavascriptCore,但有一些麻烦。我的JavaScript结构是这样的:如何在JavascriptCore中调用子功能?

var Restaurant = function() 
{ 
    this.street = function() 
    { 
     return "One Street 45"; 
    } 

    this.postal = function() 
    { 
     return "90210"; 
    } 
} 

现在,在Javascript中我创建了一个功能,它允许一个餐厅将自身添加到地图:

addMeToTheMap(Restaurant); 

而且在JSContext这个映射到:

self.context[@"addMeToTheMap"] = ^(JSValue *restaurant) { 
}; 

我发现很难,但是能够调用streetpostal函数。我试过[[restaurant callWithArguments:nil] @"street"] callWithArguments:nil],但那没有奏效。有任何想法吗?

+0

你是如何创建对'餐厅'的引用? – Oxcug

+0

我不是。 javascript中的'Restaurant'变量可以有任何名称。 – user4992124

+0

对,我的意思是你在做:'JSValue * restaurant = self.context [@“Restaurant”]'? – Oxcug

回答

0

为什么

想想你在逻辑上说[[restaurant callWithArguments:nil] @"street"] callWithArguments:nil]

您在JavaScript中的餐厅功能中没有return语句。所以[restaurant callWithArguments:nil]将返回void。

还有streetpostal都返回字符串。不是this,因此[[... @"street"] callWithArguments:nil]正试图调用一个字符串作为函数。更何况这不应该由于[... @"some string"]而编译。

你真正想要

什么你想要做的是使用上JSValueobjectForKeyedSubscript:方法返回一个JSValue。所以不要使用callWithArgs。你应该这样做:

[restaurant[@"street" <or> @"postal"] callWithArguments:nil] 

这将返回你的字符串包裹在JSValue。您可以使用toString解开。

+0

那么,如果我这样做,它会返回'(null)'。这是我改变它:'self.context [@“addMeToTheMap”] = ^(JSValue * restaurant)NSLog(@“street:%@”,[restaurant [@“street”] callWithArguments:nil]) ; };' – user4992124

+0

你可以登录'餐厅'和'餐厅[@“街道”]吗? – Oxcug

相关问题