Можно ли получить доступ к свойствам объекта, доступ к которым можно получить только с помощью обозначения в квадратных скобках, когда они находятся внутри оператора «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"?
}
1
Anurag 7 Июн 2010 в 01:50

3 ответа

Лучший ответ

Ничего себе, это старо, но ответы здесь неправильные, на самом деле есть способ сделать именно так, как вы просите.

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

Ты видел это? valueOf () - волшебное слово. Он возвращает примитивное значение своего родительского объекта или, если объект не имеет примитивного значения, сам объект. Каждый объект и объектоподобный примитив наследуют этот метод, так как он является встроенным свойством Object.prototype. Итак ... поехали.

2
MooGoo 10 Сен 2010 в 19:36

Как я понимаю, с помощью (o), по сути, происходит переход к области действия o, поэтому свойства доступны по их именам: «bad» и «goodProperty» соответственно.

with(o) {
  bad="new value";
  goodProperty=22;
}
0
user268396 6 Июн 2010 в 21:56

Обычно ключевое слово 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"!
}

Надеюсь, это поможет.

1
Laramie 6 Июн 2010 в 22:09