javascript - Cross browser support for get and set properties -


my goal implement , set properties on javascript objects.

object.defineproperty seems supported in ie9+ on non dom object. want work down ie7.

__definegetter__ deprecated

there seems workarounds aka "hacks":

// super amazing, cross browser property function, based on http://thewikies.com/ function addproperty(obj, name, onget, onset) {      // wrapper functions     var         oldvalue = obj[name],         getfn = function () {             return onget.apply(obj, [oldvalue]);         },         setfn = function (newvalue) {             return oldvalue = onset.apply(obj, [newvalue]);         };      // modern browsers, ie9+, , ie8 (must dom object),     if (object.defineproperty) {          object.defineproperty(obj, name, {             get: getfn,             set: setfn         });      // older mozilla     } else if (obj.__definegetter__) {          obj.__definegetter__(name, getfn);         obj.__definesetter__(name, setfn);      // ie6-7     // must real dom object (to have attachevent) , must attached document (for onpropertychange fire)     } else {          var onpropertychange = function (e) {              if (event.propertyname == name) {                 // temporarily remove event doesn't fire again , create loop                 obj.detachevent("onpropertychange", onpropertychange);                  // changed value, run through set function                 var newvalue = setfn(obj[name]);                  // restore function                 obj[name] = getfn;                 obj[name].tostring = getfn;                  // restore event                 obj.attachevent("onpropertychange", onpropertychange);             }         };            obj[name] = getfn;         obj[name].tostring = getfn;          obj.attachevent("onpropertychange", onpropertychange);      } }  // must dom object (even if it's not real tag) attached document var myobject = document.createelement('fake'); document.body.appendchild(myobject);  // create property myobject.firstname = 'john'; myobject.lastname = 'dyer'; addproperty(myobject, 'fullname',     function() {         return this.firstname + ' ' + this.lastname;     },     function(value) {         var parts = value.split(' ');         this.firstname = parts[0];         this.lastname = (parts.length > 1) ? parts[1] : '';     });  console.log(myobject.fullname); // returns 'john dyer' 

another alternative john resig

i'm not fan of code above due dom element part. there "better" options of today? of posts i've found on subject @ least 1 year old.

similar thread


Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

reactjs - React router and this.props.children - how to pass state to this.props.children -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -