область действия и свойства «с» в квадратных скобках
-
24-10-2019 - |
Вопрос
Можно ли получить доступ к свойствам объекта, к которым можно получить доступ только с помощью квадратных скобок внутри оператора «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"?
}
Решение
Вау, это старое, но ответы здесь неправильны, на самом деле есть способ сделать именно так, как вы спрашиваете.
with({'!@#$%': 'omg', d: 'hai'}) {
console.log(d); //hai - naturally
console.log(valueOf()['!@#$%']); //omg - OMG
}
Ты видел это? ценность() это волшебное слово. Он возвращает примитивное значение своего родительского объекта или, если объект не имеет примитивного значения, сам объект. Каждый объект и объект, похожий на примитив, наследуют этот метод, так как он является встроенным свойством на Object.prototype
. Анкет Так ... вот ты.
Другие советы
Обычно ключевое слово 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"!
}
Надеюсь, это поможет.
Как я понимаю, с (O) по существу прыгает к объему O, свойства доступны по их имени: «Плохой» и «GoodProperty» соответственно.
with(o) {
bad="new value";
goodProperty=22;
}