2009-11-18 3 views
4

Je me demande si cela est possible en JavaScript, je veux avoir un objet qui pourrait contenir des propriétés dynamiques.Propriété dynamique de l'objet JavaScript?

donner un exemple:

function MyObject() 
{ 
} 

var myobj = new MyObject(); 
myobj.property1 = "something"; 

alert(myobj.property1); // something 
alert(myobj.property2); // this should never report error, instead the property should be evaluated to null, as it has never been set. 

Est-il possible d'intercepter des appels de propriété en JavaScript Je peux proactivement définir une propriété sans valeur nulle?

Merci.

+3

Pourquoi voulez-vous explicitement à « nulle »? Est-ce que "indéfini" ne suffit pas? –

+0

Je pensais que mon application ne prend pas de valeur indéfinie, j'ai juste essayé, non défini fait le même travail, donc je suppose que cela peut être fermé maintenant. Merci à tous. – Nominee

Répondre

1

Non. JavaScript n'est pas Smalltalk.

+0

Alors, je suppose que je devrais faire quelque chose comme ceci: MyObject.prototype.getProperty = function (nom) { if (this.hasOwnProperty (nom)) retourner ce [nom]; sinon return null; } Ensuite, j'utiliserai myobj.getProperty (propertyName) quand j'ai besoin d'y accéder. On dirait que c'est la meilleure option. – Nominee

0

Non, sauf si vous manipulez un objet contrôlé par un plug-in NPAPI auquel cas vous pouvez implémenter le comportement souhaité. En d'autres termes, grâce à un plugin NPAPI, vous pouvez implémenter le comportement que vous recherchez.

4

Ceci est à peu près aussi proche que vous pouvez atteindre votre objectif.

code:

var obj = {}; 
alert("prop: " + obj.prop); 
obj.prop = "something"; 
alert("prop: " + obj.prop); 
delete obj.prop; 
alert("prop: " + obj.prop); 

Comportement:

 
Alert: "prop: undefined" 
Alert: "prop: something" 
Alert: "prop: undefined" 
0

Découvrez des prototypes javascript. Je pense que cela vous donnera au moins certains de ce que vous cherchez. Il suffit de google up "prototype javascript".

0

Dans votre exemple, la deuxième alerte ne générera pas d'erreur. Il va juste alerter undefined. L'accès aux propriétés des propriétés génère une erreur:

myobj.property2.property3 
1

Il n'existe aucun moyen d'intercepter les accès directs aux propriétés dans JavaScript. Lorsqu'une propriété n'a pas été définie, le résultat sera undefined. Bien que null et undefined sont généralement considérés comme la même chose, ils sont en fait des entités différentes.

En JavaScript undefined signifie aucune valeur et null signifie une valeur de null. Dans certains cas, vous pouvez mélanger undefined et null. Par exemple, lorsque vous utilisez l'opérateur ==, ils sont équivalents ((null == undefined) === true). En utilisant l'opérateur sans contrainte, ===, ils sont différents ((null === undefined) === false).

Vous pouvez utiliser ceci à votre avantage. Alors que la plupart des gens prétendent que vous devez utiliser l'opérateur d'égalité sans contrainte (===), il est préférable de mettre null et undefined dans le même compartiment, à moins que vous ne vous souciez réellement de la différence entre les deux. Là où ça devient compliqué, c'est que undefined est une propriété de l'objet global et peut donc recevoir une nouvelle valeur.

Si quelqu'un devait dire undefined = 'donkey' alors null == undefined commencerait à retourner false. En pratique, ce n'est presque jamais un problème puisque la plupart des gens ne sont pas assez stupides pour réaffecter la valeur de indéfini.

Ainsi, dans une sorte de rond-point chemin, vous ne avez pas besoin de propriété piège accès à retourner null pour les propriétés qui n'ont pas été établies tant que vous comparez le résultat à l'aide null==.

2

Oui, mais seulement dans la version 2.0 et supérieure. La syntaxe exacte est toujours à déterminer, mais il semblerait que ce soit get *() {...} pour les littéraux d'objets au moins.

+1

Une URL source pour cela serait vraiment utile. Jusqu'à présent, je n'ai trouvé que la spécification pour [direct proxies] (http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies) dans ES.next qui permet ce que le PO recherchait. –

+0

Il a posé des questions sur JS, pas ES. Quoi qu'il en soit, JS 2.0 est quasiment annulé et ES.next est ce que les navigateurs vont implémenter. –

3

« Proxy » peut faire

var myobj = new Object(); 
var handler = { 
    get:function (obj, name, proxyed){ 
     if(obj[name] !== undefined) // if obj[name] exist 
      return obj[name];  // then return obj[name] 
     return null; // if obj[name] is not exist then return null; 
    } 
}; 
var obj = new Proxy(myobj, handler); 
obj.property1 = "something"; 

alert(myobj.property1); // something 
alert(myobj.property2); // undefined 

alert(obj.property1); // something 
alert(obj.property2); // null 
Questions connexes