什么是正确的方式来连接2个JavaScript对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

我目前面临一个难题:将2个javascript对象连接在一起的正确方法是什么?

想象一下像一个文本编辑器这样的应用程序,它具有多个不同的文件 我有一些代表笔记本视图的HTML页面。我有一个文件notebook.js,其中包含NotebookController和Notebook View的类定义。

NotebookControler对象负责在笔记本上执行业务逻辑,如“保存笔记本”,“加载笔记本”,“新笔记本”。NotebookView负责管理用于演示的HTML。它做低级别的东西,比如“get / set notebook body”,“get / set notebook name”。它还监听DOM事件(onClick)并触发业务事件(saveNotebook)。这是我对被动视图模式的尝试。

我希望我的JavaScript客户端代码是面向对象的,分离的问题和单元测试。我想用模拟的NotebookView测试NotebookController,反之亦然。这意味着我不能在NotebookController中实例化NotebookView。我也是

  • 在我的notebook.js中放置一些逻辑,将2连接在一起
  • 在我的应用程序中有一个全局函数,它知道实例化每个函数并将它们连接在一起
  • 使用依赖注入,无论是自制的还是类似SquirrelIoc的

在Java中,选择是一个很自然的选择:使用Spring。但这似乎不是JavaScript-y。什么是正确的做法?

提问于
用户回答回答于

感谢您的洞察力。我最终编写了一个简单的JavaScript依赖注入工具。经过一段时间的辩论和你的评论之后,我发现DI确实是正确的答案,因为:

  1. 它将布线的问题与业务逻辑完全分开,同时保持布线逻辑接近布线。
  2. 它允许我一般地在对象上提供一个“你全部连线”的回调函数,以便我可以进行3阶段初始化:实例化所有内容,将所有内容连接起来,调用每个人的回调并告诉他们他们已经连线。
  3. 很容易检查缺少依赖的问题。

所以这里是DI实用程序:

var Dependency = function(_name, _instance, _dependencyMap) {
    this.name = _name;
    this.instance = _instance;
    this.dependencyMap = _dependencyMap;
}

Dependency.prototype.toString = function() {
    return this.name;
}

CONCORD.dependencyinjection = {};

CONCORD.dependencyinjection.Context = function() {
    this.registry = {};
}

CONCORD.dependencyinjection.Context.prototype = {
    register : function(name, instance, dependencyMap) {
        this.registry[name] = new Dependency(name, instance, dependencyMap);
    }, 
    get : function(name) {
        var dependency = this.registry[name];
        return dependency != null ? dependency.instance : null;
    },

    init : function() {
        YAHOO.log("Initializing Dependency Injection","info","CONCORD.dependencyinjection.Context");
        var registryKey;
        var dependencyKey;
        var dependency;
        var afterDependenciesSet = [];
        for (registryKey in this.registry) {
            dependency = this.registry[registryKey];
            YAHOO.log("Initializing " + dependency.name,"debug","CONCORD.dependencyinjection.Context");

            for(dependencyKey in dependency.dependencyMap) {
                var name = dependency.dependencyMap[dependencyKey];
                var instance = this.get(name);
                if(instance == null) {
                    throw "Unsatisfied Dependency: "+dependency+"."+dependencyKey+" could not find instance for "+name;
                }
                dependency.instance[dependencyKey] = instance; 
            }

            if(typeof dependency.instance['afterDependenciesSet'] != 'undefined') {
                afterDependenciesSet.push(dependency);
            }
        }

        var i;
        for(i = 0; i < afterDependenciesSet.length; i++) {
            afterDependenciesSet[i].instance.afterDependenciesSet();
        }
    }

}
用户回答回答于

依赖注入可能是你最好的选择。与Java相比,JS代码中的某些方面更容易实现,因为您可以将充满回调的对象传递到NotebookController。其他方面比较困难,因为您没有静态代码分析来形式化它们之间的接口。

扫码关注云+社区