Javascript 每次调用对象中的任何函数时运行函数

Javascript 每次调用对象中的任何函数时运行函数,javascript,Javascript,如果我有一个如下所示的对象: var animal = { cat: function() { alert('woof'); }, dog: function() { alert('meow'); } } 如何将另一个函数“附加”到animal,以便在调用animal对象中的任何函数时运行该函数?(无需在每个例程中手动调用)没有简单的方法。如果您已经编写了所有的“原始”方法,并且知道调用回调的内容,那么您可以按照Felix在注释和循环中对对象上的每个属性所述的操作,如果它是一

如果我有一个如下所示的对象:

var animal = { 
    cat: function() { alert('woof'); },
    dog: function() { alert('meow'); }
}

如何将另一个函数“附加”到
animal
,以便在调用
animal
对象中的任何函数时运行该函数?(无需在每个例程中手动调用)

没有简单的方法。如果您已经编写了所有的“原始”方法,并且知道调用回调的内容,那么您可以按照Felix在注释和循环中对对象上的每个属性所述的操作,如果它是一个函数,请将其重新指定为调用回调的新函数:

for (key in obj) {

    if (typeof(key) === 'function') {
        obj[key] = function() {
            obj[key](); //I think this is closed over, didn't test though (might get clobbered)
            callback();
        }
    }
}
编辑以将
key()
更改为
obj[key]()

make()
函数接受一个函数参数,并返回一个新函数

新函数执行您想要的任何操作(在本例中,它只调用
console.log()
),然后调用原始函数

当调用原始时,它设置
this
的当前值,并传递
参数。它通过使用
function.prototype.apply
调用函数来实现这一点,该函数从第一个参数设置
this
值,并将参数作为第二个参数的集合传递

它还返回从函数返回的值

var EntriesRegistry=(函数(){
var实例=null;
函数_构造函数(){
变量
self=这个,
观察={};
this.set=函数(n,v)
{
自我[n]=v;
如果(观察[n])
对于(var i=0;i

这允许您将回调绑定到对象事件更改

现在您唯一能做的就是迭代每个函数属性,并将它们包装到一个新函数中,该函数也会调用另一个函数。对于未来,ES6定义了您可能能够使用的“代理对象”。。。总有一天。()。
key
是属性的名称和字符串。您不能调用它。
是字符串,不是方法。是的,您没有测试它。键是一个字符串。你不会传递任何论点。你什么也不退。
for (var p in animal) {
    if (typeof animal[p] === "function") {
        animal[p] = make(animal[p]);
    }
}

function make(fn) {
    return function() {
        console.log("this is called for every animal");
        // call the original
        return fn.apply(this, arguments);
    }
}
var EntriesRegistry = (function(){

    var instance = null;

    function __constructor() {

        var
            self = this,
            observations = {};

        this.set = function(n,v)
        {
            self[n] = v;

            if( observations[n] )
                for( var i=0; i < observations[n].length; i++ )
                    observations[n][i].apply(null, [v, n]);

        }

        this.get = function(n)
        {
            return self[n];
        }

        this.observe = function(n,f)
        {

            if(observations[n] == undefined)
                observations[n] = [];

            observations[n].push(f);
        }

    }

    return new function(){
        this.getInstance = function(){
            if (instance == null)
            {
                instance = new __constructor();
                instance.constructor = null;
            }
            return instance;
        }
    }
})();

var entries = EntriesRegistry.getInstance();

var test = function(v){ console.log(entries); };
var name = function(person){
    alert("Hello " + person.first + " " + person.last);
}

/*entries.set('bob', 'meh');

entries.get('bob');*/

entries.observe('employer', name);
entries.observe('seth', test);

entries.set('seth', 'lo');
entries.set('employers', {first: 'test', last: 'test'});