是否可以侦听任何函数调用或状态更改
我有一个包装另一个
的对象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(..)
我想听听......
答案 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,以防万一它对任何其他人都有用:
一般的答案是否定的,不是。至少不是在每个浏览器中,所以任何人给出的任何解决方案在许多情况下都不会起作用。
有一些事情可以发挥作用,但又有一些可怕的支持:
击>