-
-
Save flackjap/f318e6a2b316e4d9fa44 to your computer and use it in GitHub Desktop.
Fork of object.watch polyfill in ES5. Modified to not react when the value set is the same as previous.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* object.watch polyfill | |
* | |
* 2012-04-03 | |
* | |
* By Eli Grey, http://eligrey.com | |
* Public Domain. | |
* | |
* Modified by Nenad Damnjanović | |
* Nov 9, 2014 | |
* | |
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. | |
*/ | |
// object.watch | |
if (!Object.prototype.watch) { | |
Object.defineProperty(Object.prototype, "watch", { | |
enumerable: false | |
, configurable: true | |
, writable: false | |
, value: function (prop, handler) { | |
var | |
oldval = this[prop] | |
, getter = function () { | |
return oldval; | |
} | |
, setter = function (newval) { | |
if (oldval !== newval) { | |
handler.call(this, prop, oldval, newval); | |
oldval = newval; | |
} | |
else { return false } | |
} | |
; | |
if (delete this[prop]) { // can't watch constants | |
Object.defineProperty(this, prop, { | |
get: getter | |
, set: setter | |
, enumerable: true | |
, configurable: true | |
}); | |
} | |
} | |
}); | |
} | |
if (!Object.prototype.unwatch) { | |
Object.defineProperty(Object.prototype, "unwatch", { | |
enumerable: false | |
, configurable: true | |
, writable: false | |
, value: function (prop) { | |
var val = this[prop]; | |
delete this[prop]; // remove accessors | |
this[prop] = val; | |
} | |
}); | |
} | |
/** | |
* | |
* Example usage: | |
* | |
* | |
var o = {p: 1}; | |
o.watch("p", function (id, oldval, newval) { | |
console.log( "o." + id + " changed from " + oldval + " to " + newval ); | |
return newval; | |
}); | |
o.p = 2; // should log the change | |
o.p = 2; // should do nothing | |
* | |
* | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you!
p.s.: I wonder if by standard it should trigger if a variable is set to the same value again.