5

そこで、John Resig のブログを読んでいて、彼のマイクロ テンプレート JavaScript エンジンを見て、プロトタイプの継承についての理解を深めるために、JavaScript 用の独自のテンプレート管理システムを実装してみることにしました。しかし、書き始めてすぐに問題が発生しました。

まず、私の基本コードは次のとおりです。

function template_manager() { };

template_manager.prototype = {
    tags: {},
    templates: {},
    output: {},
    default_template: "default",
    set: function (tags, template_name) {
        template_name = "Greetings!";
        //template_name = this._util.template(this.nothing, this.default_template);
        console.log(template_name);
    },
    get: function(tags, template_name) {
        console.log("Getting");
    },
    unset: function(tags, template_name) {
        console.log("Removing");
    },
    render: function(template_name) {
        console.log("Rendering");
    },
    //_util goes here
};

// Take it for a quick test drive.
test = new template_manager;
test.set();
test.get();
test.unset();
test.render();

次に、いくつかの一般的なコードの作業を開始し、それをユーティリティ オブジェクトに入れることにしました。

    _util: {
        // Used to set the default values for optional arguments
        optional: function(obj, def_value) {
            return (typeof obj === "nothing") ? obj : def_value;
        },
        template: function(template_name) {
            return this._util.optional(template_name, this.default_template);
        },
    },

そして今、_util.template()関数内で関数を呼び出そうとすると、オブジェクトではなくオブジェクトを指しているset()ため、もちろんエラーが発生します。jQuery メソッドを見てみましたが、それが何をしているのか理解できたと思います。私の質問は、私は自分自身を実装する必要がありますか、またはjQueryのメソッドを使用する必要がありますか、それとも私のオブジェクトからオブジェクトを呼び出す別の方法はありますか?this_utiltemplate_managerextendextendtemplate_manager_util

(PSプロトタイプの継承に関するDouglas Crockford の記事を読みましたが、答えはそこにあると思いますが、残念ながらまだ完全には理解できていません。)

4

1 に答える 1

8

あなたは、callまたはapplyすなわちを使用することができます

template_manager.prototype = {
    set: function (tags, template_name) {
        template_name = "Greetings!";
        template_name = this._util.optional.call(this, this.nothing, this.default_template);
        console.log(template_name);
    }
}

より明確な説明については、記事「JavaScript でバインドされた状況から抜け出す」を参照してください。

于 2010-03-03T22:02:37.363 に答える