“Con” scope e proprietà con la notazione parentesi quadra
-
24-10-2019 - |
Domanda
E 'possibile accedere alle proprietà degli oggetti che possono essere raggiunte solo con la notazione parentesi quadra, quando all'interno di un "con" l'istruzione.
Esempio:
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"?
}
Soluzione
Wow questo è vecchio, ma le risposte qui sono sbagliato, non v'è infatti modo di fare esattamente come si chiede.
with({'!@#$%': 'omg', d: 'hai'}) {
console.log(d); //hai - naturally
console.log(valueOf()['!@#$%']); //omg - OMG
}
L'hai visto? valueOf () è la parola magica. Restituisce il valore di base del suo oggetto genitore, o se l'oggetto non ha valore di base, l'oggetto stesso. Ogni oggetto e l'oggetto simile eredita primitive questo metodo, in quanto è costruito in proprietà su Object.prototype
. Quindi ... ci si va.
Altri suggerimenti
In genere, la parola chiave con viene utilizzato per risolvere gli spazi dei nomi lunghi, non un solo riferimento a un oggetto. Credo che avrei bisogno di sapere che cosa l'intento di utilizzare la parola chiave qui è. Non credo che il parser sintassi vi permetterà di ottenere via con o.bad:property
, che è fondamentalmente quello che è stato codificato utilizzando con.
Se l'oggetto o
nell'esempio era solo una scorciatoia per uno spazio dei nomi più lungo, la mia raccomandazione sarebbe quella di fermarsi un oggetto nella risoluzione utilizzando con, poi mettere box vostra proprietà in una stringa come questo ...
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"!
}
La speranza che aiuta.
Se ho capito bene con (o) salta essenzialmente alla portata della o, quindi le proprietà sono accessibili con il loro nome:. “Cattivo” e “goodProperty”, rispettivamente
with(o) {
bad="new value";
goodProperty=22;
}