Écoutez les invocations d'état et de fonction

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:

  • Événements dom modifiés (FF uniquement, je crois)
    • DOMAttrModified
    • DOMNodeInserted
    • DOMNodeRemoved
    • etc
  • Object.watch (FF uniquement)