2012-09-26 23 views
1

我試圖探索SpiderMonkey(最新版本)中的一些JavaScript與公共C JSAPI。複製爲...與SpiderMonkey公共API的循環

如何使用公共JSAPI調用(例如JS_GetPropertyById,JS_LookupProperty,JS_Enumerate等)複製for...in循環的行爲? documentation for JS_Enumerate表示它只返回目標對象的枚舉屬性;它不會搜索對象原型鏈中的屬性。我想複製for...in循環的確切行爲,但是避免將代碼注入到JS環境中。它看起來像JS_NewPropertyIterator可能會被棄用,或者是棄用的強有力候選者。

回答

1

我的第一印象是這可能不是一件好事。這不是我永遠不會做的事情,因爲for...in的行爲有點怪異和特殊,我不認爲這是正確的事情。但如果這真的是你想要的,請繼續閱讀。

在內部,實際的for...in循環使用js::ValueToIterator,並且該函數似乎不通過JSAPI公開(至少jsapi.cpp不會在任何地方調用它)。所以,你有兩個選擇:

  1. 說服Mozilla的JS團隊通過JSAPI揭露for...in機械(如果你願意幫助的工作,這是可行的);或

  2. 實際上編譯一些JS代碼,其中有一個for...in循環。

選項2對您來說會更快。您可以使用此功能,例如:

function ForInResults(obj) { 
    return [v for (v in obj)]; 
} 

或者如果你喜歡一個迭代:

function ForInIterator(obj) { 
    for (var v in obj) 
     yield v; 
} 

您可以編譯或者使用JS_CompileFunction這些功能,然後使用JS_CallFunctionValue調用它。要從陣列中獲取單個元素,請使用JS_GetArrayLengthJS_GetElement。從迭代器中獲取值有點棘手,但它更像是一個真正的for...in循環,在正在循環中添加或刪除屬性的不尋常情況下。