-
-
Save travishaynes/b394f9c0a37f86afd27f to your computer and use it in GitHub Desktop.
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 | |
* 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; | |
} | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Added multiple callback support, and the ability to override assigned values.