IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Réflexions sur Object.watch()


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 098
    Par défaut Réflexions sur Object.watch()
    Salut à tous !

    En parcourant la doc de Greasemonkey, je viens de faire une trouvaille intéressante : la méthode Object.watch() de Netscape et ses héritiers.

    Cette méthode consiste à surveiller l’affectation d’une propriété d’un objet (ainsi que les variables globales si l’objet est window). Un exemple :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var o = {};
    o.watch('x', function( propName, oldValue, newValue ) {
    	console.log(propName + ' modified from ' + oldValue + ' to ' + newValue);
    	return newValue;
    });
    o.x = 42;
    Lorsqu’une propriété est ainsi surveillée, l’affectation se fait avec la valeur de retour de la fonction et non plus avec la valeur initialement passée.

    Bien sûr, cette méthode a été implémentée a des fins de contrôle amélioré, par exemple vérifier qu’un nombre est bien dans un intervalle. On peut même rendre des propriétés readonly !

    Mais ma première impression a été que ça ne respecte pas l’esprit du langage. Ça ressemble plus à du C++ avec sa surcharge de l’opérateur d’affectation. Le code est moins prévisible, on a des imprévus lorsqu’on utilise dynamiquement les noms de propriétés, etc.

    Donc en dépit de la puissance de cette méthode, je me dis que c’est pas plus mal qu’elle ne fasse pas partie du standard (à ce que j’ai pu voir, on n’a rien d’équivalent sous IE).

    Et vous, qu’en pensez-vous ?

    https://developer.mozilla.org/en/Cor...s/Object/watch
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    PHP dispose bien de ses fonctions "magiques" __get et __set, Python de __getattr__, etc...

    Pour aller un peu plus loin, un peu d'AOP permet de résoudre bien des situations (debug, etc...) . Il existe d'ailleurs quelques sources très simple sur le net qui permettent de l'implémenter en Javascript.

    ERE

  3. #3
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    javascript possède également des méthodes get et set

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 098
    Par défaut
    Je vois ça, je suis en train de découvrir
    __defineGetter__ et __defineSetter__ semblent être des méthodes standard. Voilà qui me révèle une facette du langage que j’ignorais complètement…

    Edit: En fait, ça ressemble davantage à du C# que du C++.
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var o = {};
    (function closureOnX() {
     
    	var _x;
    	o.__defineGetter__('x', function getX() {
    		return _x;
    	});
    	o.__defineSetter__('x', function setX( v ) {
    		console.log('x changed from ' + _x + ' to ' + v);
    		_x = v;
    	});
     
    })();
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    ou plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    <script type="text/javascript">
     
    	function Field(val){
    		this.value = val;
    	}
     
    	Field.prototype = {
    		get value(){
    			return this._value;
    		},
    		set value(val){
    			alert("impossible d'affecter la valeur");
    			//this._value = val;
    		}
    	};
     
     
        var test = new Field();
    	//Undefined
    	alert(test.value);
    	//Message d'alert
    	test.value = "test";
    	//Valeur toujour undefined
    	alert(test.value);
     
    </script>
    </head>
    <body>
    </body>
    </html>

  6. #6
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Je vois ça, je suis en train de découvrir
    __defineGetter__ et __defineSetter__ semblent être des méthodes standard. Voilà qui me révèle une facette du langage que j’ignorais complètement…

    Edit: En fait, ça ressemble davantage à du C# que du C++.
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var o = {};
    (function closureOnX() {
     
    	var _x;
    	o.__defineGetter__('x', function getX() {
    		return _x;
    	});
    	o.__defineSetter__('x', function setX( v ) {
    		console.log('x changed from ' + _x + ' to ' + v);
    		_x = v;
    	});
     
    })();
    https://developer.mozilla.org/en/Cor...t/defineGetter

    Ce n'est a priori pas standard.

    ERE

  7. #7
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 098
    Par défaut
    Effectivement, ce n’est pas standard…

    J’ai essayé de trouver une solution équivalente pour IE, mais a priori on n’aurait qu’un workaround avec la propriété DOM onpropertychange.

    Pour l’instant, IE8 ne digère ni les __defineGetter__ ni le Object.defineProperty (qui est pourtant documenté sur le MSDN :/ ), ni la méthode méthode proposée par Le Chômeur.

    Enfin bon, de toute façon je me vois pas utiliser ça dans un projet
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/10/2013, 17h35
  2. [C#] Quelles explications sur Object.Equals()
    Par vandamme dans le forum C#
    Réponses: 16
    Dernier message: 22/04/2006, 01h30
  3. Réflexion sur les INDEX ... !!! ??? !!!
    Par snoopy69 dans le forum Oracle
    Réponses: 4
    Dernier message: 22/09/2005, 15h58
  4. [Java 5] Réflexion sur les énumérations type-safe
    Par rozwel dans le forum Langage
    Réponses: 5
    Dernier message: 04/12/2004, 20h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo