收听状态和函数调用

时间:2011-06-22 16:12:32

标签: javascript node.js

是否可以侦听任何函数调用或状态更改

我有一个包装另一个

的对象
function wrapper(origiObj){
   this.origObj = origObj;
}
var obj = wrapper(document);//this is an example
var obj = wrapper(db);//this is an example

现在每次有人试图调用obj.innerHTML或obj.query(..)

我想听听......

3 个答案:

答案 0 :(得分:2)

是的,有可能: 功能很简单,必须观察属性

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);

如果您的browser / node.js不支持Object.watch,请查看以下内容: Object.watch() for all browsers?

答案 1 :(得分:0)

是的,你可以为这个函数定义getter / setter属性和阴影函数,如下所示: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();

答案 2 :(得分:0)

编辑:“删除”答案,因为它标记了node.js,以防万一它对任何其他人都有用:

一般的答案是否定的,不是。至少不是在每个浏览器中,所以任何人给出的任何解决方案在许多情况下都不会起作用。

有一些事情可以发挥作用,但又有一些可怕的支持:

    <击>
  • dom修改事件(仅限FF,我相信)
    • DOMAttrModified
    • DOMNodeInserted
    • DOMNodeRemoved
  • object.watch(仅限FF)