我有一个Javascript类,它接收一个对象作为参数:
function convertible(args){
var self = this;
$.extend(self, {
/* many functions that manipulate data */
});
}
通常,使用具有此结构的对象调用此类
var result = new convertible({
'x':[{'a':[/*...*/],'c':'asdf'}/*...*/],
'y':[{'a':[/*...*/],'c':10}/*...*/],
'z':[{'a':[/*...*/],'c':255},{'a':[],'c':255}/*...*/]
});
此对象中的属性数量每个请求都是可变的,c
和a
的内容未知。有时,a
内部会有一些需要转换的特殊对象,如:
var result = new convertible({
'z':[{'a':[0, {'PF':/*string to be eval'led*/}],'c':255}]
});
以递归方式执行,以“处理”所有参数,有时在Webkit中会导致RangeError最大调用堆栈达到错误,因此,我不是手动使用for..in
循环进行迭代,而是试图设想一个helper迭代器类以及装饰器模式,所以当我做args.get(0)
或args.foreach(function(){})
时,我得到'转换'的PF对象(这是一个得到评估的内联函数)。问题是,有时a
部分是这样的(为了更清晰的可视化而缩进):
var result = new convertible({
'z':[
{
'a':[
[{'PF':/*string to be eval'led*/}],
{'PF':{/*another object that MIGHT have PF inside*/}}
]
}
]
});
由于生成的代码的动态特性,它会导致PF
变量的某些“不一致”。当类型为'PR'时,它是z
内的嵌套a
对象。像这样:
var result = new convertible({
'z':[
{
'a':[
{
'PR': {
'z': [
{'a': [/*...*/], 'c': 0}
]
}
}
]
}
]
});
我的脑子已经短路了,试图设想这个迭代器/装饰器类。