Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les getters/setters sous IE

    1 octobre 2009 à 21:22:47

    Bonjour.
    Je voudrais savoir s'il était possible de définir des setter/getters sous IE (en appelant les attributs par obj.attr et non pas par obj.getAttr() ).
    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      1 octobre 2009 à 23:02:33

      Object.defineProperty(document.body, "description", {
      	get : function () {
      		return this.desc;
      	},
      	set : function (val) {
      		this.desc = val;
      	}
      });
      document.body.description = "Content container";
      


      ?

      Mais tu devrais arrêter ta fixation sur les setter / getter xD
      C'est pas parce que tu l'as découvert récemment que c'est une raison pour l'y foutre partout :p
      • Partager sur Facebook
      • Partager sur Twitter
        2 octobre 2009 à 13:08:00

        Mais donc il n'y a pas moyen de faire en sorte que ça : http://www.siteduzero.com/forum-83-447 [...] html#r4213981
        marche sous IE ?

        J'ai fini par trouver un script qui fait que ça amrche sous IE (il m'a l'air bien moche mais je vais regarder pour l'améliorer) : http://morglog.org/?p=56

        Le script un peu amélioré :
        (function() { 
        	var gettysetty = { 
        		clock: 0,
        		gets: [],
        		sets: []
        	};
        	var refresh = function() {
        		//
        		for(var i = 0, l = gettysetty.gets.length; i < l; i++) { 
        			gettysetty.gets[i][0][gettysetty.gets[i][1]] = gettysetty.gets[i][2]();
        		}
        		//
        		for(i = 0; i < gettysetty.sets.length; i++) 
        		if(gettysetty.sets[i][0][gettysetty.sets[i][1]] != gettysetty.sets[i][2]["ogVar"]) { 
        			gettysetty.sets[i][2].apply(gettysetty.sets[i][0], [ gettysetty.sets[i][0][gettysetty.sets[i][1]] ]); 
        			gettysetty.sets[i][2]["ogVar"] = gettysetty.sets[i][0][gettysetty.sets[i][1]]; 
        		} 
        	};
        	Object.prototype.__defineGetter__ = function(attr, fct) { 
        		this[attr] = fct();  
        		gettysetty.gets.push([this, attr, fct]);
        		if(!gettysetty.clock) {
        			setInterval(refresh, 13);
        		}
        		return this;
        	}
        	Object.prototype.__defineSetter__ = function(attr, fct) { 
        		fct["ogVar"] = this[attr]; 
        		gettysetty.sets.push([this,attr,fct]); 
        		if(!gettysetty.clock) {
        			setInterval(refresh, 13);
        		}
        	}
        	
        	
        	function lookup(gs, attr) {
        		for(var i = 0, l = gettysetty[gs].length; i < l; i++) {
        			if(gettysetty[gs][i][0] == this && gettysetty[gs][i][1] == attr) {
        				return gettysetty[gs][i][2];
        			} else {
        				return;
        			}
        		}
        	}
        	Object.prototype.__lookupSetter__ = function(attr) { 
        		return lookup.apply(this, ["sets", attr]); 
        	};
        	Object.prototype.__lookupGetter__ = function(attr) { 
        		return lookup.apply(this, ["gets", attr]); 
        	};
        })(); 
         
        var x = {}; 
        x.time = "aze";
        x.__defineGetter__("time", function() {
        	return 'ok'; 
        });
        alert(x.time)
        
        • Partager sur Facebook
        • Partager sur Twitter
          4 octobre 2009 à 11:13:57

          En bidouillant, j'ai réussit à faire un truc à peu près correcte :
          (function() {
          	if (!Object.prototype.__defineGetter__) {
          		var __init__ = function(attr) {
          			if (!this.__poo__) {
          				this.__poo__ = {};
          			}
          			if (!this.__poo__[attr]) {
          				this.__poo__[attr] = {};
          			}
          			if (!this.__poo__[attr].setter) {
          				this.__poo__[attr].setter = {};
          			}
          			if (!this.__poo__[attr].getter) {
          				this.__poo__[attr].getter = {};
          			}
          		};
          		Object.prototype.__defineGetter__ = function(attr, fct) {
          			__init__.call(this,attr);
          			this.__poo__[attr].getter.fct = fct;
          			var fct_getter = (function(that,attr) {
          				return function() {
          					that[attr] = that.__poo__[attr].getter.fct();
          				};
          			})(this, attr);
          			this.__poo__[attr].getter.interval = window.setInterval(fct_getter, 13000);
          			fct_getter();
          			return this;
          		}
          		Object.prototype.__defineSetter__ = function(attr, fct) {
          			__init__.call(this,attr);
          			this.__poo__[attr].setter.fct = fct;
          			this.__poo__[attr].setter.stored_value = this[attr];
          			var fct_setter = (function(that,attr) {
          				return function() {
          					if(that.__poo__[attr].setter.stored_value != that[attr]) {
          						that.__poo__[attr].setter.stored_value = that[attr] = that.__poo__[attr].setter.fct(that[attr]);
          					}
          				};
          			})(this, attr);
          			this.__poo__[attr].setter.interval = window.setInterval(fct_setter, 13000);
          			return this;
          		}
          		Object.prototype.__lookupGetter__ = function(attr) { 
          			return this.__poo__[attr].getter.fct; 
          		};
          		Object.prototype.__lookupSetter__ = function(attr) { 
          			return this.__poo__[attr].setter.fct; 
          		};
          		Object.prototype.__deleteGetter__ = function(attr) {
          			window.clearInterval(this.__poo__[attr].getter.interval);
          			delete this.__poo__[attr].getter.fct;
          		};
          		Object.prototype.__deleteSetter__ = function(attr) {
          			window.clearInterval(this.__poo__[attr].setter.interval);
          			delete this.__poo__[attr].setter.fct;
          		};
          	} else {
          		Object.prototype.__deleteGetter__ = function(attr) {
          			var setter = this.__lookupSetter__(attr);
          			var value = this[attr];
          			delete this[attr];
          			this[attr] = value;
          			if(setter) {
          				this.__defineSetter__(attr, setter);
          			}
          		};
          		Object.prototype.__deleteSetter__ = function(attr) {
          			var getter = this.__lookupGetter__(attr);
          			var value = this[attr];
          			delete this[attr];
          			this[attr] = value;
          			if(getter) {
          				this.__defineGetter__(attr, getter);
          			}
          		};
          	}
          })();
          
          /*
          var x = {};
          x.__defineGetter__("time", function() {
          	return 'ok'; 
          });
          alert(x.__lookupGetter__("time"));
          x.__defineGetter__("time", function() {
          	return 'aze'; 
          });
          alert(x.__lookupGetter__("time"));
          x.__deleteGetter__("time");
          alert(x.__lookupGetter__("time"));
          window.setTimeout(function(){x.time = "aze";},14);
          */
          

          Mais le problème c'est que i je le met un un prototype, ça marche pas >_<
          Vous n'auriez pas une idée ?
          • Partager sur Facebook
          • Partager sur Twitter

          Les getters/setters sous IE

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown