Created
April 30, 2010 01:38
-
Star
(828)
You must be signed in to star a gist -
Fork
(195)
You must be signed in to fork a gist
-
-
Save eligrey/384583 to your computer and use it in GitHub Desktop.
object.watch polyfill in ES5
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. | |
* 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] | |
, newval = oldval | |
, getter = function () { | |
return newval; | |
} | |
, setter = function (val) { | |
oldval = newval; | |
return newval = handler.call(this, prop, oldval, 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; | |
} | |
}); | |
} |
@mateuszgwozdz Vue.js can do it.
@georgir What are you referring to, exactly? Can you provide an example?
Is it possible to watch window and check when variable is set with var el
?
value: function( prop, handler ){
var oldval = this[prop],
getter = () => ( oldval ),
setter = function( val ){
if ( oldval != val ){ // event with a different value
handler.call( this, prop, oldval, val);
return ( oldval = val );
}
};
@stefek99 : the handler function must return the new value
alternatively, if you want a behavior more akin watchers in vue/react/angular you can modify the setter function as follows:
setter = function (val) {
oldval = newval;
return newval = (function() {
handler.call(this, prop, oldval, val);
return val;
})();
};
if forces the new value to always be passed and assigned to the property, and the handler function becomes just "notified" of the change
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Has anyone developed a version that would track children properties too?