代码之家  ›  专栏  ›  技术社区  ›  Anurag

带方括号符号的“with”范围和属性

  •  1
  • Anurag  · 技术社区  · 15 年前

    在“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 回复  |  直到 15 年前
        1
  •  2
  •   MooGoo    15 年前

    哇,这很古老,但这里的答案是错误的,事实上,有办法做到你所要求的。

    with({'!@#$%': 'omg', d: 'hai'}) {
      console.log(d); //hai - naturally
      console.log(valueOf()['!@#$%']); //omg - OMG
    }
    

    你看到了吗? valueOf() 是一个神奇的词。它返回其父对象的基元值,或者如果对象没有基元值,则返回对象本身。每个对象和类似对象的基元继承此方法,因为它是 Object.prototype . 那么……给你。

        2
  •  1
  •   Laramie    15 年前

    通常,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"!
    }
    

    希望有帮助。

        3
  •  0
  •   user268396    15 年前

    根据我对(o)的理解,本质上跳到了o的范围内,因此属性可以通过它们的名称来访问:分别是__bad_157;和__goodproperty_157;。

    with(o) {
      bad="new value";
      goodProperty=22;
    }
    
    推荐文章