Javascript在执行任何对象方法时触发自定义方法

Javascript在执行任何对象方法时触发自定义方法,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我有一个对象,它的原型中添加了一些方法: var MyClass = function() { this.name = ''; this.innerData = []; this._callbacks = {}; }; MyClass.prototype.add = function(data) { this.innerData.push(data); }; MyClass.prototype.remove= function(data) { //This

我有一个对象,它的原型中添加了一些方法:

var MyClass = function() {
    this.name = '';
    this.innerData = [];
    this._callbacks = {};
};
MyClass.prototype.add = function(data) {
    this.innerData.push(data);
};
MyClass.prototype.remove= function(data) {
    //This part is working
    for (var i=0; i < this.innerData.length; i++) {
        if (this.innerData[i].desc === desc) {
            this.innerData.splice(i, 1);
        }
    }
};
MyClass.prototype.on = function(evname, callback) {
    if (!this._callbacks[evname]) {
        this._callbacks[evname] = $.Callbacks();
    }
    this._callbacks[evname].add(callback);
};
到目前为止,我尝试在任何方法中添加一个检查,询问该方法是否已在回调中注册,但这很麻烦,对于任何新方法,我需要添加不属于该方法功能的if,如果任何其他开发人员想要添加功能,他/她必须知道该附加代码

我在纯JS和Jquery中都检查了自定义事件,但我肯定不知道如何做

有人有主意吗? 谢谢

类似的东西在FIREFOX上测试过吗? 其思想是采用MyClass.prototype中的任何方法,并将其封装在一个函数中,该函数调用回调,然后调用原始方法。所以每次调用该方法时,都会调用保存的回调,这就是您需要的吗

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="utf-8" />
    <title>Untitled</title>

<script>

var MyClass = function() {
    this.name = '';
    this.innerData = [];
};
MyClass.prototype.add = function(data) {
    this.innerData.push(data);
};
MyClass.prototype.remove= function(data) {
    //This part is working
    for (var i=0; i < this.innerData.length; i++) {
        if (this.innerData[i].desc === desc) {
            this.innerData.splice(i, 1);
        }
    }
};
MyClass.prototype.on= function(fname,callback) {

    var originalFunction=MyClass.prototype[fname];
    var givenCallback=callback;

    MyClass.prototype[fname]=function() {

       givenCallback.call();
       var args = Array.prototype.slice.call(arguments);

       originalFunction.apply(this,args);
    }
};

var c = new MyClass();
c.on('add', function() { console.log("Adding data"); });
c.add("aaa");
c.add("bbb");

</script>
</head>
<body>

</body>
</html>

FIDDLE:

我不确定我是否完全理解您的意思,但您是否希望每次触发事件时触发相关回调/回调?为什么不使用另一个方法来传递事件名称,并让该方法检查是否存在回调?嗨!我想要实现的是以一种自动的方式激发每个已注册的方法,即加载到回调对象中的方法,也就是说,在所有方法中都不需要它。它就像一个可观察的对象,例如:如果注册要触发的“add”方法,那么无论何时调用它,事件都将被触发。从现在起,我找到的唯一方法是,在add方法中,询问它是否已加载到callbacks对象中,如果是,则触发已注册的回调。不好的定义。很难做一个通用的解决方案,因为如果你想在触发之前或之前或者中间触发它,或者如果你想为被调用的事件自定义事件对象/参数。最好在所有函数中都有这样的代码。beforeAddEvent.callAllarg1,arg2。也许我不理解你的答案。您正在on方法中调用作为参数传递的方法,比如add,对吗?但是,如果稍后我再次调用add方法,是否会触发回调?如果on函数在单个事件中多次被调用,这可能会导致堆栈溢出异常,或者如果前一个函数没有调用,则会导致异常exist@LoganMurphy是的,我们的想法是叫它一次,如果您需要大量回调,那么代码会变得更复杂,您可以在一个包装函数中调用多个回调,是的,这只是一个概念,错误处理就是其中之一omitted@FrancescoMM非常感谢,你的解决方案帮了我很大的忙!!现在我必须检查如何将变量传递到回调,因为我尝试传递的参数总是空的:我想必须研究更多的JS…@jmares您可以向MyClass.prototype.on添加更多参数,以便将固定参数发送到回调,或者您可以传递相同的参数,以应用于givenCallback.call;因此,回调函数将获得add和this的所有相同参数作为对象。
<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="utf-8" />
    <title>Untitled</title>

<script>

var MyClass = function() {
    this.name = '';
    this.innerData = [];
};
MyClass.prototype.add = function(data) {
    this.innerData.push(data);
};
MyClass.prototype.remove= function(data) {
    //This part is working
    for (var i=0; i < this.innerData.length; i++) {
        if (this.innerData[i].desc === desc) {
            this.innerData.splice(i, 1);
        }
    }
};
MyClass.prototype.on= function(fname,callback) {

    var originalFunction=MyClass.prototype[fname];
    var givenCallback=callback;

    MyClass.prototype[fname]=function() {

       givenCallback.call();
       var args = Array.prototype.slice.call(arguments);

       originalFunction.apply(this,args);
    }
};

var c = new MyClass();
c.on('add', function() { console.log("Adding data"); });
c.add("aaa");
c.add("bbb");

</script>
</head>
<body>

</body>
</html>
MyClass.prototype.on= function() {
    var onArgs = Array.prototype.slice.call(arguments);

    var originalFunction=MyClass.prototype[onArgs[0]];
    var givenCallback=onArgs[1];

    var callbackArgs=onArgs.slice(2);

    MyClass.prototype[onArgs[0]]=function() {

       var args = Array.prototype.slice.call(arguments);

       givenCallback.apply(this,callbackArgs);
       originalFunction.apply(this,args);
    }
};

var c = new MyClass();
c.on('add', function(a,b) { console.log("Adding data '"+a+"',"+b+" obj:"+this); },"called add",1);
c.add("aaa");
c.add("bbb");