我有一个来自我的REST服务的JSON对象。在服务器和前端,我声明了具有相同名称但相互补充的常量。
他们共享一些数据,但大多数每个常量只包含与前端或后端相关的内容。在前端,从后端常量映射前端常量的首选方法是什么?
在后端,BuildingType
是一个枚举。在下面的JSON对象中,它是第一个字段buildingType
{buildingType: "CANNON", hp: 100, level: 1, location: Object, name: "Cannon"}
以下是将其映射到常量
的前端版本的javascript代码 var imageMetadata = eval("clashalytics.Images." + building.buildingType);
// In this case, the eval is the same as
var imageMetadata = clashalytics.Images.CANNON;
我主要是java开发人员,fyi。
答案 0 :(得分:1)
eval("clashalytics.Images." + building.buildingType)
相当于
clashalytics.Images[building.buildingType]
你可以像这样定义一个getter
function getConst(target, path) {
return target[path];
}
并使用它
getConst(clashalytics.Images, building.buildingtype)
不要不必使用eval!
eval()是一个危险的函数,它执行它传递的代码 具有来电者的特权。如果使用字符串运行eval() 可能会受到恶意方的影响,您最终可能会运行 具有您的权限的用户计算机上的恶意代码 网页/扩展程序。更重要的是,第三方代码可以看到 调用eval()的范围,可能导致可能的攻击 以类似函数不易受影响的方式。
eval()通常也比替代品慢,因为它必须 调用JS解释器,同时优化许多其他构造 通过现代JS引擎。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
答案 1 :(得分:1)
首先,你永远不应该使用:Eval()
。它有security implications
并且可能会干扰范围链。 (Eval()
可以访问和修改其外部作用域中的变量,而Function cannot
)。
其次," Javascript是一种弱类型语言,这意味着您不会事先声明变量具有特定类型"。请从Stijn de Witt
作为一种解决方法,您可以使用Object.freeze()
,在https://developer.mozilla.org
:Object.freeze()
因此,您的代码将如下所示:
var Cannon = Object.freeze({"hp":100, "level":1, "location":Object, "name": "Cannon"})
然后您可以像普通对象一样访问Cannon enumerators
:Cannon.hp
会给你100等等......
如果您有任何疑问,请告诉我。