2014-02-06 27 views
2

我一直在爲iOS的JavaScriptCore搞亂,我一直在試圖找出一種方法來做一些沿着從V8的「SetIndexedPropertiesToExternalArrayData」的行,我會有一個JavaScript對象,並設置它是數組數據指向另一個對象的數組。舉例來說,如果我有一個空的JavaScript對象,而另一個JavaScript對象,看起來像:JavaScriptCore外部陣列

{ '0': 0, '1': 1, '2': 2 }; 

如果我是使空的JavaScript對象都指向數組對象,每當我打電話[什麼曾經是空的] array []運算符,它將與其他javascript的數組值相同。

我一直在嘗試玩弄不同的東西,我還沒有找到辦法做到這一點。我的最終目標是在iOS中創建類型化的數組,但是如果我沒有弄錯,在iOS構建的JavaScriptCore中,外部數組和類型化數組是不存在的?

非常感謝。

回答

0

以下IOS代碼顯示了一個示例,在iOS內部的JavaScriptCore中將一個對象的一個​​對象分配給另一個對象,然後在複製後使用目標對象上的數組運算符。 我也展示了在Objective-C和JavaScriptCore之間傳遞這些對象,它們都是作爲Objective-C中設置的離散Javascript對象以及將對象作爲參數傳遞給Javascript函數。

JSContext *javascriptContext = [[JSContext alloc] init]; 
javascriptContext[@"consoleLog"] = ^(NSString *message) { 
    NSLog(@"Javascript log: %@",message); 
}; 

NSDictionary *myArray = [NSDictionary dictionaryWithObjectsAndKeys:@0, @"item0", @1, @"item1", @2, @"item2", nil]; 
NSLog(@"myArray = %@", myArray); 
javascriptContext[@"obj1"] = myArray; 
[javascriptContext evaluateScript:@"var myFunction = function(arrayArg) { 
    consoleLog(\"obj1['item2'] = \" + obj1['item2']); 
    consoleLog(\"arrayArg['item0'] = \" + arrayArg['item0']); 
    var obj2 = obj1; 
    consoleLog(\"obj2['item1'] = \" + obj2['item1']); 
    obj1 = { 'key0': 0, 'key1': 1, 'key2': 2 }; 
    obj2 = obj1; 
    consoleLog(\"obj2['key0'] = \" + obj2['key0']); 
    return obj2; 
};"]; 
JSValue *function = javascriptContext[@"myFunction"]; 
NSArray *argList = [NSArray arrayWithObjects:myArray, nil]; 
JSValue *result = [function callWithArguments:argList]; 
NSDictionary *javascriptArray = [result toObject]; 
NSLog(@"javascriptArray returned = %@", javascriptArray); 

如果你要複製此代碼,請刪除包含JavaScript函數(我添加了這些爲清楚起見)在字符串中嵌入換行符。

此代碼產生以下控制檯日誌:

2014-02-07 16:49:55.901 TestHarness[4674:70b] myArray = { 
    item0 = 0; 
    item1 = 1; 
    item2 = 2; 
} 
2014-02-07 16:49:55.903 TestHarness[4674:70b] Javascript log: obj1['item2'] = 2 
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: arrayArg['item0'] = 0 
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['item1'] = 1 
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['key0'] = 0 
2014-02-07 16:49:55.905 TestHarness[4674:70b] javascriptArray returned = { 
    key0 = 0; 
    key1 = 1; 
    key2 = 2; 
} 

正如可以從樣本代碼看到,IOS JavaScriptCore的框架提供內置的NSDictionary對象和Javascript陣列之間的轉換。查看JSValue.h,它將這種內置轉換描述爲:NSDictionary轉換爲JavaScript「對象」,但數組運算符對從Objective-C注入的值工作正常,並且爲新的Javascript鍵控數組返回的對象是有效的Objective-C中的NSDictionary對象這是否解決了您的問題或者我誤解了?

+0

在將數組分配給JavaScript對象後,更改Objective-C外部數組中的一個元素的進一步實驗顯示,JavaScriptCore獲取數組內容的副本而不是指向外部數組(它看不到更改) 。我不認爲我的答案能解決你的問題。 – Mike

+0

是的,雖然我很感謝幫助,但這不幸並沒有解決問題。對於JavaScriptCore而言,它確實是在將數組複製到objective-c中,試圖讓一個javascript對象的數組指向另一個似乎是不可能的。我仍然在想辦法做到這一點,但迄今爲止沒有運氣。 – iNightfaller

+0

我還想指出,我只是試圖爲索引數組做這個。我有幾個包含其他對象的JavaScript類,比如「函數」和對象需要的其他數據,所以試圖只將索引部分指向另一個數組似乎相當困難。 – iNightfaller