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 has nothing to with JS inheritance, though you might use some Callbacks objects for organising your callbacks.

You could do something like

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);
};

Now, everything that inherits from Parent.prototype can use this method which checks for a "callback" array on the current instance, executes them and then recursively walks up the prototype chain until there is no fire method.

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");

However, I usually recommend not to use new for creating inheritance chains. Depending on your application structure, it might work, but know what you are doing. You could easily get lost in inheritance of nested objects, and also you might need to avoid creating local variables in your constructors.

于 2012-11-22T01:37:33.423 に答える