1

我的 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),我将不胜感激。

4

1 回答 1

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用于创建继承链。根据您的应用程序结构,它可能会起作用,但要知道您在做什么。您很容易迷失在嵌套对象的继承中,而且您可能需要避免在构造函数中创建局部变量。

于 2012-11-22T01:37:33.423 回答