如何从Javascript中的自定义对象继承所有事件处理程序

时间:2012-11-21 22:16:21

标签: javascript events inheritance event-handling prototype

我的JavaScript应用程序基于原型继承。考虑一系列构造函数,而较高成员的新实例用作较低成员的原型。通过这种方式,属性可以在整个链中继承。

现在,我想通过一个类似的事件处理系统来扩展它。事件处理程序应该从顶部到底部继承。

function Parent() {};
Parent.prototype = new function() {
    this.foo = "bar";
}

function Child() {};
Child.prototype = new Parent();
with(Child.prototype) {
    qax = "foobar";
}

通过Child()实例触发事件也应该从Parent()调用(继承)事件处理程序。但是,Parent()应该只调用它自己的事件处理程序,因为没有更高的对象。

如果有人知道如何做到这一点(最好使用jQuery),我将不胜感激。

1 个答案:

答案 0 :(得分:0)

jQuery与JS继承无关,但您可能会使用一些Callbacks对象来组织回调。

您可以执行类似

的操作
Parent.prototype.fire = function(args) {
    if (this.hasOwnProperty("callbacks")) {
         for (var i=0; i<this.callbacks.length; i++)
             this.callbacks[i].call(null, args);
    }
    var proto = Object.getPrototypeOf(this);
    if (proto && "fire" in proto)
        proto.fire(args);
};

现在,从Parent.prototype继承的所有内容都可以使用此方法检查当前实例上的“回调”数组,执行它们,然后递归地遍历原型链,直到没有fire方法

function Child() {
    this.callbacks = [console.log.bind(console, "Child level:")];
}
Child.prototype = new Parent;

function GrandChild() {
    this.callbacks = [console.log.bind(console, "GrandChild level:")];
}
GrandChild.prototype = new Child;

var gc = new GrandChild;
gc.fire("something");

但是,我通常建议不要使用new来创建继承链。根据您的应用程序结构,它可能有效,但知道您在做什么。您可能很容易迷失在嵌套对象的继承中,也可能需要避免在构造函数中创建局部变量。