2010-05-03 12 views
10

Le moteur JavaScript Spider-singe implémente la fonction de rappel __noSuchMethod__ pour les objets JavaScript.Catch accès à la propriété non définie dans JavaScript

Cette fonction est appelée à chaque fois que JavaScript tente d'exécuter une méthode non définie d'un objet.

Je voudrais définir une fonction de rappel à un objet qui sera appelée à chaque fois on accède à une propriété non définie dans l'objet ou affecté.

Je n'ai pas trouvé une fonction __noSuchProperty__ implémentée pour les objets JavaScript et je suis curieux si une solution de contournement permet d'obtenir le même résultat.

Consultez le code suivant:

var a = {}; 
a.__defineGetter__("bla", function(){alert(1);return 2;}); 
alert(a.bla); 

Il est équivalent à [alert(1);alert(2)] - même si a.bla est indéfini.

Je voudrais obtenir le même résultat, mais aux propriétés inconnues (sans savoir à l'avance qu'un. « Bla » sera la propriété accessible)

Répondre

4

dans la prochaine version de ECMAScript il devrait être assez facile, en utilisant Object.observe En savoir plus ici: http://addyosmani.com/blog/a-few-new-things-coming-to-javascript/

+0

Merci Moshe. Accepté cette réponse, car il résout la question originale. – avri

+1

Cette réponse ne résout pas la question. La fonctionnalité que vous recherchez est appelée ['Proxy' et elle ne sera pas implémentée de sitôt] (http://stackoverflow.com/q/6429521/1269037). –

2

je voudrais définir une fonction de rappel à un Objet qui sera appelé chaque fois qu'une propriété non définie dans l'objet est accessible ou attribuée.

Bien que ce ne soit pas une réponse exhaustive, gardez à l'esprit que l'affectation de propriétés non définies d'un objet est une caractéristique clé du langage JavaScript.

Notez également que __noSuchMethod__is a non-standard method, implémenté par les moteurs JavaScript de Mozilla. Il y a un open feature request pour que cela soit implémenté dans le moteur V8 de Google Chrome, mais pour autant que je sache, ceci n'est pas supporté par d'autres navigateurs.

Au mois de février 2014, It looks like this won't be supported any time soon.

+0

Merci pour vos ans wer - Je devrais affiner ma question comme suit: Y a-t-il un moyen de faire de même dans le moteur JavaScript de Spider-Monkey? – avri

+0

@avri: 'noSuchMethod' est pris en charge dans SpiderMonkey, mais je doute que vous trouverez une méthode intégrée qui attire tente d'affecter des propriétés non définies, car ce sont les traits en fait de la langue. –

+1

Je ne pense pas que le fait que l'attribution de propriétés non définies d'un objet étant un élément clé du langage JavaScript doit la matière - est fait, JavaScript fournit les méthodes et __defineGetter__ __defineSetter__. Consultez le code suivant: var a = {}; a .__ defineGetter __ ("bla", fonction() {alert (1); return 2;}); alerte (a.bla); Cela équivaut à [alert (1); alert (2)] - même si a.bla n'est pas défini. J'aimerais obtenir le même résultat mais avec des propriétés inconnues (c.-à-d.sans savoir à l'avance qu'un. "bla" sera la propriété accédée) – avri

2

, les gars, je pense que nous devons voter pour cette fonctionnalité sur la liste des questions Google V8, ici http://code.google.com/p/v8/issues/detail?id=264

Il semble qu'il n'y a pas beaucoup d'attention à cette caractéristique très importante . :(

+0

[L'équipe de développeurs V8 ne s'en soucie pas] (http://stackoverflow.com/q/6429521/1269037). –