1

我不确定这个标题是否有意义,但基本上我正在尝试为我正在开发的应用程序编写一个非常简单的 Javascript 依赖注入容器。

这是容器:

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

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

        library[name] = module;
    };
};

然后我创建一个 Backbone 模型并将其添加为依赖项,如下所示:

(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

这完全是因为 javascript 如何绑定“this”,即执行 all 时的上下文。它会给来自其他不同背景的人带来最初的困惑。摆脱 JavaScript 中的绑定情况为您所看到的内容提供了极好的解释。有多种技术可以解决这个问题:-)

这里有几篇文章可能会有所帮助,

希望这有帮助。

于 2013-07-28T15:14:37.623 回答
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 回答