【问题标题】:Get Property of Local Object using String使用字符串获取本地对象的属性
【发布时间】:2016-03-22 19:28:10
【问题描述】:

我想通过使用它的“完全限定”变量名来获取局部对象变量的属性值。

function foo() {
    var obj = {
        prop: "val"
    }

    var valueStr = "obj.prop";
    var value = // code here that gets value using valueStr
}

我见过this answer 用于从字符串中获取全局变量,我见过this other answer 用于使用字符串从对象中获取属性,但是获取对象的最简单方法是什么 AND 该对象的属性全部来自字符串?我不希望我的对象必须是全局的。

这是我目前正在做的解决此问题的方法,但它要求将对象设为全局变量。

var valueStrParts = valueStr.split(".");
var value = window[valueStrParts[0]][valueStrParts[1]];

我宁愿不使用eval(),但如果必须,我会使用。但是,我需要能够验证它评估的字符串是否已经过清理,并且除了访问属性之外不会做任何事情。

【问题讨论】:

  • obj 是全局变量吗?
  • 抱歉,我的问题措辞有误。我已经修好了
  • 除了在特定设置中使用 eval 之外似乎没有其他方法。但是,您可以声明一个将所有变量作为属性保存的对象。 See this and look how the variables are defined in the function。然后你可以做myWrappingObj[...][...]
  • 你为什么害怕使用 eval?这在所有情况下都不是邪恶的。当您使用它来更改范围链时,它将消耗性能。但是在您的情况下,我们只是在访问一个属性。这不会影响任何事情。
  • @Raj 我实际上是在使用它来回答this question。如果我确实使用 eval,我希望能够首先清理字符串,这样我除了访问属性之外什么都不做。

标签: javascript string object properties


【解决方案1】:

您可以为此使用eval()

var obj = { prop: "val" };
var valueStr = "obj.prop";
var func = function(str){ console.log(eval(str)) };
func.call(obj, valueStr);

只需将执行evalscope 更改为您的object,然后将您的string 传递进去。

DEMO

【讨论】:

  • 为了我提出这个问题的目的,如果我确实使用 eval,我需要能够先清理字符串。出于某种原因,该对象是本地的。有没有办法可以确认字符串只会访问一个属性值,仅此而已?
  • @4castle 您可以通过jsfiddle.net/jum3hmg5/3 解决该问题,这也是XSS 攻击的漏洞。 :)
  • 当然,但这并不是我之前所拥有的真正的安全改进。 See this change(CSS 中描述的更改)
  • @4castle 我没有改进任何东西,只是实现了我所拥有的。在我们看到 OP 项目的全貌之前,我们无法对这种情况发表评论。
  • 对,但我希望找到一个不假设变量是全局变量或 js 字符串是安全的通用案例解决方案。现在安全是我关心的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2020-06-05
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2019-12-07
相关资源
最近更新 更多