"Con" alcance y propiedades con notación de soporte cuadrado
-
24-10-2019 - |
Pregunta
¿Es posible acceder a las propiedades del objeto a las que solo se puede acceder con la notación de soporte cuadrado cuando está dentro de una declaración "con"?
Ejemplo:
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"?
}
Solución
Vaya, esto es antiguo, pero las respuestas aquí están mal, de hecho, hay una manera de hacer exactamente como usted le pide.
with({'!@#$%': 'omg', d: 'hai'}) {
console.log(d); //hai - naturally
console.log(valueOf()['!@#$%']); //omg - OMG
}
¿Lo viste? valor de() es la palabra mágica. Devuelve el valor primitivo de su objeto principal, o si el objeto no tiene valor primitivo, el objeto en sí. Cada objeto y objeto primitivo hereda este método, ya que es una propiedad incorporada en Object.prototype
. Ahí vas.
Otros consejos
En general, la palabra clave se usa para resolver espacios de nombres largos, no una sola referencia de objeto. Supongo que necesitaría saber cuál es la intención de usar la palabra clave aquí. No creo que el analizador de sintaxis te permita salirse con la tuya o.bad:property
, que es básicamente lo que se está codificando con.
Si el o
El objeto en el ejemplo era solo un atajo a un espacio de nombres más largo, mi recomendación sería detener un objeto corto en la resolución usando con con, luego colocar su propiedad en una cadena como esta ...
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"!
}
Espero que ayude.
Según tengo entendido con (o) esencialmente salta al alcance de O, por lo que las propiedades son accesibles por su nombre: "malo" y "GoodProperty" respectivamente.
with(o) {
bad="new value";
goodProperty=22;
}