我有一个 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
我不是使用循环手动迭代,而是尝试与装饰器模式一起构思一个辅助迭代器类,所以当我这样做args.get(0)
或args.foreach(function(){})
我得到“转换”的 PF 对象(这是一个被 eval 引导的内联函数)时。问题是,有时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}
]
}
}
]
}
]
});
我的脑袋短路了,已经在尝试构思这个迭代器/装饰器类了。