Réponse à partir de 2011 (voir ci-dessous pour un 2013 mise à jour):
Non, JavaScript n'est pas un fourre-tout bien caractéristique. L'accesseur de la syntaxe que vous utilisez couverts dans l'Article 11.1.5 de la spécification, et n'offre pas un caractère générique ou quelque chose comme ça.
Vous pouvez, bien sûr, de mettre en œuvre une fonction pour le faire, mais je devine que vous ne voulez probablement pas à utiliser f = obj.prop("foo");
plutôt que d' f = obj.foo;
et obj.prop("foo", value);
plutôt que d' obj.foo = value;
(ce qui serait nécessaire pour la fonction pour gérer les propriétés inconnues).
FWIW, la fonction get (je n'ai pas pris la peine avec le setter de la logique) ressemblerait à quelque chose comme ceci:
MyObject.prototype.prop = function(propName) {
if (propName in this) {
// This object or its prototype already has this property,
// return the existing value.
return this[propName];
}
// ...Catch-all, deal with undefined property here...
};
Mais encore une fois, je ne peux pas imaginer que vous auriez vraiment envie de faire cela, car de la façon dont il change la façon dont vous utilisez l'objet.
Réponse en 2013:
Cela va bientôt changer (et il a déjà de la mise à jour pour les utilisateurs de Firefox): ECMAScript 6e édition aura des procurations. Ils sont définis dans le projet de spécification, et aussi sur cette page (mais la spec brouillons ont priorité).
Les procurations vous permettent de créer des objets qui sont de véritables mandataires (façades) pour d'autres objets. Voici un exemple simple qui transforme toutes les valeurs de propriété qui sont des chaînes de caractères pour tous les bouchons sur la récupération:
var original = {"foo": "bar"};
var proxy = new Proxy(original, {
get: function(target, name, receiver) {
var rv = target[name];
if (typeof rv === "string") {
rv = rv.toUpperCase();
}
return rv;
}
});
console.log("original.foo = " + original.foo); // "bar"
console.log("proxy.foo = " + proxy.foo); // "BAR"
Exemple Vivant | Source
Les opérations que vous ne la supplante pas avoir leur comportement par défaut. Ci-dessus, tous nous remplacer est - get
, mais il y a toute une liste d'opérations que vous pouvez brancher dans.
Dans l' get
fonction de gestionnaire d'arguments de la liste:
-
target
est l'objet proxy (original
, dans notre cas).
-
name
est (évidemment) le nom de la propriété en cours de récupération.
-
receiver
est soit le proxy lui-même ou quelque chose qui en hérite. Dans notre cas, receiver
est ===
proxy
, mais si l' proxy
ont été utilisés comme un prototype, receiver
pourrait être un descendant de l'objet, d'où qu'il soit sur la signature de la fonction (mais à la fin, de sorte que vous pouvez facilement laisser de côté si, comme notre exemple ci-dessus, vous n'en utilisent pas).
Cela vous permet de créer un objet avec le fourre-tout getter et le setter de la fonction que vous voulez:
var obj = new Proxy({}, {
get: function(target, name) {
if (!(name in target)) {
console.log("Getting non-existant property '" + name + "'");
return undefined;
}
return target[name];
},
set: function(target, name, value) {
if (!(name in target)) {
console.log("Setting non-existant property '" + name + "', initial value: " + value);
}
target[name] = value;
}
});
console.log("[before] obj.foo = " + obj.foo);
obj.foo = "bar";
console.log("[after] obj.foo = " + obj.foo);
Exemple vivant | Source (Notez que j'ai quitté receiver
off les fonctions, car nous ne l'utilisons pas. receiver
est une option du quatrième arg sur set
.)
La sortie de la ci-dessus est:
L'obtention de la non-existant de la propriété 'foo'
[avant] obj.foo = undefined
Paramètre inexistant propriété 'foo', la valeur initiale: bar
[après] obj.foo = bar
Notez comment nous obtenons le "non-existant" message lorsque nous essayons de récupérer foo
lorsqu'il n'existe pas encore, et encore, quand nous le créer, mais pas par la suite.