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.
Comments
Post a Comment