【问题标题】:Access Enum in javascript from JSON object从 JSON 对象访问 JavaScript 中的枚举
【发布时间】:2015-05-31 16:17:39
【问题描述】:

我有一个来自我的 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 开发人员,仅供参考。

【问题讨论】:

  • 不完全确定你在问什么,可以改进它以使其更清晰。但是该 eval 代码相当于 clashalytics.Images[building.buildingtype] 没有所需的 eval。除非绝对必要,否则 Eval 通常不是一个好主意,因为它的开销可能很高。
  • 我知道 eval 不是要走的路,只是让它工作的快速方法。试过了,它的工作原理!谢谢。随意张贴作为答案。虽然我会等待标记为答案,看看是否还有其他选择。

标签: javascript json rest enums


【解决方案1】:

使用array-like notation

eval("clashalytics.Images." + building.buildingType)

等价于

clashalytics.Images[building.buildingType]

你可以像这样定义一个吸气剂

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

【讨论】:

    【解决方案2】:

    首先,你不应该使用:Eval()。它有security implications 并且会干扰作用域链。 (Eval() 可以访问和修改其外部范围内的变量,而Function cannot)。

    其次,“Javascript 是一种弱类型语言,这意味着您不会事先将变量声明为具有特定类型”。请从Stijn de Witt看这个网站enums-in-javascript

    作为一种解决方法,您可以使用Object.freeze(),在https://developer.mozilla.org 上有很好的解释:Object.freeze()

    因此,您的代码将如下所示:

    var Cannon = Object.freeze({"hp":100, "level":1, "location":Object, "name": "Cannon"})

    然后你可以像访问普通对象一样访问你的Cannon enumeratorsCannon.hp 会给你 100,等等......

    如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2018-12-18
      • 2016-09-27
      • 2011-07-09
      • 1970-01-01
      • 2017-06-05
      相关资源
      最近更新 更多