"с" областью действия и свойствами с обозначением в квадратных скобках - PullRequest
1 голос
/ 07 июня 2010

Можно ли получить доступ к свойствам объекта, доступ к которым возможен только с помощью квадратных скобок, если они находятся внутри оператора «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 ]

2 голосов
/ 10 сентября 2010

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

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

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

1 голос
/ 07 июня 2010

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

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

0 голосов
/ 07 июня 2010

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

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