Est-il possible d'écouter toute invocation de fonction ou changement d'état?
J'ai un objet qui enroule un autre
function wrapper(origiObj){ this.origObj = origObj; } var obj = wrapper(document);//this is an example var obj = wrapper(db);//this is an example
Maintenant chaque fois que quelqu'un essaie d'invoquer obj.innerHTML ou obj.query (…)
J'aimerais l'écouter …
Oui, c'est possible: les fonctions sont faciles et les propriétés doivent être surveillées
function FlyingObject(obj){ this.obj = obj; for(var p in obj){ if(typeof obj[p] == 'function'){ console.log(p); this[p] = function(){ console.log("orig func"); }; }else{ this.watch(p,function(){ console.log("orig property"); }); } } } var obj = { f:function(a,b){ return a+b}, m:1 }; var fo = new FlyingObject(obj); fo.m = 5; fo.f(1,4);
Si votre navigateur / node.js ne prend pas en charge Object.watch, vérifiez ceci: Object.watch () pour tous les navigateurs?
Oui, vous pouvez définir un getter
/ setter
pour les propriétés et une fonction d'ombre pour la fonction comme ceci: http://jsfiddle.net/fHRyU/1/ .
function wrapper(origObj){ var type = origObj.innerHTML ? 'doc' : 'db'; if(type === "doc") { var orig = origObj.innerHTML; origObj.__defineGetter__('innerHTML', function() { // someone got innerHTML alert('getting innerHTML'); return orig; }); origObj.__defineSetter__('innerHTML', function(a) { // someone set innerHTML alert('setting innerHTML'); orig = a; }); } else if(type === "db") { var orig = origObj.query; origObj.query = function() { //someone called query; alert('calling query'); orig.apply(this, arguments); }; } return origObj; } var obj = wrapper(document.body); obj.innerHTML = 'p'; alert(obj.innerHTML); var db = function() {} db.query = function() {alert('foo');} obj = wrapper(db); obj.query();
Éditer: "Supprimer" la réponse puisqu'il est identifié node.js, en le laissant au cas où il serait utile pour quelqu'un d'autre:
La réponse générale est non, ce n'est pas le cas. Au moins pas dans tous les navigateurs, donc toute solution que quelqu'un donne ne va pas fonctionner dans de nombreux cas.
Il y a quelques choses qui peuvent fonctionner, mais là encore, il y a un soutien horrible pour elles: