看起来很简单...
如果我在 JavaScript 处理程序中设置它:
var storage;
稍后,我检索了一个属性的 JSON 字典,我想在 storage
上设置该字典。我的字典看起来像这样:
{
"type": "foo",
"set_on_global": "storage",
"property_dict": {
"some": "thing",
"baz": "bam"
}
}
问题:
有没有办法使用 set_on_global
在我的全局 storage
变量上设置property_dict
对象,例如:
storage.property_dict = {
"some": "thing",
"baz": "bam"
};
谢谢!
编辑:
当storage
不是全局但仅保存在内存中时,该怎么做?
解决方案:所以这就是它的工作原理。似乎它仅适用于二传手方法,例如:
var setter = function (set_on, set) {
switch (set_on) {
case "storage":
storage.property_dict = set;
break;
}
}
不是大粉丝,因为它需要硬编码"存储",所以也许还有另一种方法。
像这样?您始终可以从窗口对象访问全局变量。
window[json.set_on_global] = json.property_dict;
已编辑 - 已更新以回答后续问题
这取决于您是否有权访问它。假设它是在类中定义的,并且它是公开的。然后你可以做同样的事情。
obj[json.set_on_global] = json.property_dict;
其中 obj 是该类的实例。
如果它是类中的私有变量,那么您需要公开它或有一个 setter 来实现这一点。
这就是你要问的,对吧?
已编辑 2
您可以尝试在对象中存储存储。
var variables = {
storage: {}
};
var setter = function(instruction){
variables[instruction.set_on_global] = instruction.property_dict;
}
另一种方法是只公开变量,这样你就可以像这样(假设这是一个单例):
var Clz = function(){
var storage = {};
return {
storage: storage
}
}();
Clz[json.set_on_global] = json.property_dict;
这应该可以解决您的硬编码问题。我不知道您要创建哪种类,所以我想我给了您一个单例示例。
这是代码:
假设storage
是浏览器代码中的全局变量。它可以像window.storage
或window['storage']
一样访问
var json = {
"type": "foo",
"set_on_global": "storage",
"property_dict": {
"some": "thing",
"baz": "bam"
}
}
var obj = window[json.set_on_global] = {}
obj.property_dict = json.property_dict
首先,您必须将存储定义为全局
存储window.storage = {};
后来,你得到了一个JSON,只需覆盖它
window.storage.property_dict = {
"some": "thing",
"baz": "bam"
}
我不明白。你有全局storage
,为什么你不能用它来定义它的新属性? 还是您不了解如何遍历 JSON 对象?
我建议不要这样做 - 你很容易受到跨脚本攻击。封装还会建议服务器端脚本不应了解客户端脚本的内部工作原理,并且数据不应扩展它们。
因此,最好的行动方案应该是使用以下内容:
storage = json_decode(buffer);
如果需要数据来指示哪个全局变量应获取数据,请使用标识符代码和开关:
"set_on_global" : 1,
switch(buffer.set_on_global) {
case 1:
storage = buffer.property_dict;
}
(在我的脑海中,sintax可能已经关闭了)
您将设置变量。
编辑:另一个答案提出了比我在下面写的更好的解决方案。