1

このタイトルに意味があるかどうかはわかりませんが、基本的には、作業中のアプリ用に非常に単純な Javascript 依存性注入コンテナーを作成しようとしています。

これはコンテナです:

jedi = new function() {
    var library = {};

    this.module = function(name, module) {
        if (arguments.length == 1) {
            return library[name];
        }

        library[name] = module;
    };
};

次に、バックボーン モデルを作成し、次のように依存関係として追加します。

(function () {

    var addColourSchemeModel = Backbone.Model.extend({
        getColourJSON: function(prop) {
            var cols = this.get(prop).split(',');
            return {
                R: cols[0],
                G: cols[1],
                B: cols[2]
            };
        }
    });

    jedi.module('AddColourSchemeModel', addColourSchemeModel);

})();

このモジュールの新しいインスタンスを次のように作成しようとすると、問題が発生します。

var colourModel = new jedi.module('AddColourSchemeModel')({
    // json object containing model values
});

エラーが発生しますObject [object global] has no method 'set'

奇妙なことに、バックボーン モデルの初期化メソッドなどが呼び出されthisていますが、オブジェクトが初期化されるのではなくウィンドウにスコープされています。これは、ある時点で呼び出そうとしているためエラーが発生しているthis.set場所ですが、これは実際にはウィンドウです。 .

4

2 に答える 2

1

jedi.module('AddColourSchemeModel')インスタンスを作成するときは、括弧を入れる必要があります。そうしないと、コードは次のように解釈されます。

var colourModel = (new jedi.module('AddColourSchemeModel'))({
    // json object containing model values
});

したがって、正しい方法は次のとおりです。

var colourModel = new (jedi.module('AddColourSchemeModel'))({
    // json object containing model values
});
于 2013-07-28T14:58:46.430 に答える
1

これはすべて、javascript が「this」 (all を実行するときのコンテキスト) のバインディングを行う方法によるものです。他の異なるバックグラウンドを持つ人々に最初の混乱を引き起こします。JavaScript の束縛状況から抜け出すには、あなたが見ているものについての優れた説明がありました。これに対処するためのさまざまなテクニックがあります:-)

参考になりそうな記事をいくつか挙げてみますと、

この助けを願っています。

于 2013-07-28T15:14:37.623 に答える