Skip to content

Instantly share code, notes, and snippets.

@travishaynes
Forked from eligrey/object-watch.js
Last active August 29, 2015 14:17
Show Gist options
  • Save travishaynes/b394f9c0a37f86afd27f to your computer and use it in GitHub Desktop.
Save travishaynes/b394f9c0a37f86afd27f to your computer and use it in GitHub Desktop.
/*
* object.watch polyfill
*
* 2012-04-03
* Last Updated: 2015-03-24 by Travis Haynes
*
* By Eli Grey, http://eligrey.com
* Public Domain.
* 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, callback) {
var getter, newval, oldval, setter;
this.callbacks || (this.callbacks = []);
if (!(this.callbacks.indexOf(callback) > -1)) {
this.callbacks.push(callback);
}
oldval = this[prop];
newval = oldval;
getter = function() {
return newval;
};
setter = function(val) {
var index, result;
oldval = newval;
for (index in this.callbacks) {
callback = this.callbacks[index];
if (typeof callback === 'function') {
result = callback.call(this, prop, oldval, val);
if (result !== 'undefined') {
newval = result;
}
}
}
return newval = val;
};
if (delete this[prop]) {
// can't watch constants
Object.defineProperty(this, prop, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
}
});
}
// object.unwatch
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;
}
});
}
@travishaynes
Copy link
Author

Added multiple callback support, and the ability to override assigned values.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment