« Avec » la portée et les propriétés avec la notation de crochets
-
24-10-2019 - |
Question
Est-il possible de propriétés d'objet d'accès qui ne sont accessibles que par la notation carrée lorsque le support dans un « avec » déclaration.
Exemple:
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"?
}
La solution
Wow c'est vieux, mais les réponses sont ici mal, il est en fait de façon à faire exactement ce que vous demandez.
with({'!@#$%': 'omg', d: 'hai'}) {
console.log(d); //hai - naturally
console.log(valueOf()['!@#$%']); //omg - OMG
}
Avez-vous vu? valueOf () est le mot magique. Elle retourne la valeur primitive de l'objet parent, ou si l'objet n'a pas de valeur primitive, l'objet lui-même. Chaque objet et objet comme primitives hérite cette méthode, car il est construit dans la propriété sur Object.prototype
. Alors ... voilà.
Autres conseils
En général, le mot-clé avec est utilisé pour résoudre de longs espaces de noms, pas une seule référence d'objet. Je suppose que je dois savoir ce que l'intention d'utiliser le mot-clé ici est. Je ne crois pas que l'analyseur de syntaxe vous permettra de sortir avec o.bad:property
, qui est essentiellement ce qui est codé en utilisant avec.
Si l'objet o
dans l'exemple était juste un raccourci vers un espace de noms plus, ma recommandation serait d'arrêter un court objet dans la résolution en utilisant avec, puis mettre la boîte de votre propriété dans une chaîne comme ça ...
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"!
}
L'espoir qui aide.
Si je comprends avec (o) saute essentiellement à la portée de o, si les propriétés sont accessibles par leur nom. « Mauvais » et « goodProperty » respectivement
with(o) {
bad="new value";
goodProperty=22;
}