1

以下のようなコードでライブラリを使用しているとします。

(function($)
{
    function Library(el, options)
    {
        return new Library.prototype.init(el, options);
    }
    Library.fn = $.Library.prototype = {
        init: function(el, options) {
            this.$elm.on('keydown.library', $.proxy(this.keydown.init, this));
        }
        keydown: function() {
            return {
                init: function(e) {
                    ... somecode
                },
                checkStuff: function(arg1, arg2) {
                    ...someCode
                }
            }
        };
    }
})(jQuery);

これには、これへのアクセスを提供するプラグイン システムがありますObject {init: function, keydown: function...}。keydown.init 関数をオーバーライドしたい。通常、私は _.wrap のようなものを使用してそれを行うことができました:

somefunc = _.wrap(somefuc, function(oldfunc, args) {
     donewstuff();
     oldfunc.call(this.args);
});

しかし、それは返されたネストされたメソッドでは機能しないようです。

this.keydown.init = _.wrap(this.keydown.init, function(oldfunc, args) {
     donewstuff();
     oldfunc.call(this.args);
});

質問はここで答えられるかもしれませんが、このスタイルのコーディングを説明するために使用する正しい言葉を本当に知らないので、検索するのは難しいです. ネストされた戻りメソッドと呼ぶのが正しいかどうかを教えていただければ、ボーナスポイントはありますか?

4

3 に答える 3

2

このパターンはモジュールと呼ばれます。ここでできる最善の方法は、オーバーライドするメソッドをキャッシュし、キャッシュされたメソッドをオーバーライド内で呼び出すことです。

somefunc._init = somefunc.init;
somefunc.init = function () {
    doStuff();
    this._init();
};

私は _.wrap をチェックしましたが、それは同じことを行いますsomefunc. それを防ぐために、次のことができます。

somefunc.init = _.wrap(_.bind(somefunc.init, somefunc), function (oldRef, args) {
    doStuff();
    oldRef.call(this.args);
});
于 2015-04-20T16:02:28.287 に答える
1

関数が返すオブジェクトkeydownのメソッドをラップできるように、関数を装飾 (ラップ) する必要があります。init

somefunc.keydown = _.wrap(somefunc.keydown, function(orig) {
    var module = orig(); // it doesn't seem to take arguments or rely on `this` context
    module.init = _.wrap(module.init, function(orig, e) {
         donewstuff();
         return orig.call(this, e);
    });
    return module;
});
于 2015-04-20T17:33:47.397 に答える
1

問題は、メソッドがコンテキストから外れていることです。

thisそのコンテキストを設定する必要があります(これに使用.bind()します

somefunc.init = _.wrap(somefuc.init.bind(somefunc), function(oldfunc, args) {
     donewstuff();
     oldfunc.call(this.args);
});
于 2015-04-20T16:12:56.143 に答える