“with”范围和带有方括号表示法的属性

时间:2010-06-06 21:50:04

标签: javascript with-statement square-bracket

是否可以访问只能在“with”语句中使用方括号表示法访问的对象属性。

示例:

var o = { "bad-property": 1, "another:bad:property": 2, "goodProperty": 3 };

with(o) {
    console.log(goodProperty); // works awesome
    console.log(???) // how to access "bad:property"?
}

3 个答案:

答案 0 :(得分:2)

哇这已经过时了,但这里的答案是错误的,事实上有办法完全按照你的要求去做。

with({'!@#$%': 'omg', d: 'hai'}) {
  console.log(d); //hai - naturally
  console.log(valueOf()['!@#$%']); //omg - OMG
}
你看到了吗? valueOf()是神奇的词。它返回其父对象的原始值,或者如果对象没有原始值,则返回对象本身。每个对象和类似对象的原语都继承此方法,因为它是Object.prototype上的内置属性。所以......你去吧。

答案 1 :(得分:1)

通常,with关键字用于解析长命名空间,而不是单个对象引用。我想我需要知道在这里使用关键字的意图是什么。我不相信语法分析器会让你逃脱o.bad:property,这基本上是用来编码的。

如果示例中的o对象只是更长命名空间的快捷方式,我建议使用with来阻止一个对象在分辨率中缩短,然后将属性框放入这样的字符串中。

var nmSpace = new Object();
nmSpace.o = { "bad:property": 1, "goodProperty": 2 };

with (nmSpace) {
    alert(o['goodProperty']); // works awesome
    alert(o['bad:property']);  // now accesses "bad:property"!
}

希望有所帮助。

答案 2 :(得分:0)

据我所知,(o)基本上跳到o的范围,因此可以通过名称访问属性:“bad”和“goodProperty”。

with(o) {
  bad="new value";
  goodProperty=22;
}