JavaScript中的共享功能的OOP模式(例如Logger)

时间:2012-05-25 19:14:17

标签: javascript oop design-patterns

我需要有关如何在JavaScript应用程序中编写常用功能的建议。例如,有以下类:Main,Logger,App和Template。

Main创建App和Logger的实例,然后App创建Template的实例。 Main将其自身的引用传递给App的init,App将其Main的引用传递给Template的init。现在,对于对或错,Template直接引用Main中的Logger实例。这是最简单的,但它似乎不是正确的OOP,因为对logger的任何更改都需要对调用引用的每个类进行重新编程。

或者,Template只能接收对App的引用,它有一个方法来调用它对Main的引用,它有一个方法可以调用它的Logger实例。这似乎更安全,以保持每个人,但它也意味着Main将充满方法只是访问Logger和它管理的其他类。

这里不详述:我正在使用John Resig的简单JavaScript继承和RequireJS。

示例1:

var Main = {
  init: function() {
    this.logger = new Logger();
    this.app = new App(this);
  }
}

var Logger = {
  debug: function(message) { 
    console.log(message) 
  }
}

var App = {
  init: function(main) {
    this.template = new Template(main);
  }
}

var Template = {
  init: function(main) {
    main.logger.debug("Hello");
  }
}

示例2:

var Main = {
  init: function() {
    this.logger = new Logger();
    this.app = new App(this);
  }
  ,debug: function(message) {
    this.logger.debug(message);
  }
}

var Logger = {
  debug: function(message) { 
    console.log(message);
  }
}

var App = {
  init: function(main) {
    this.main = main;
    this.template = new Template(this);
  }
  ,debug: function(message) {
    this.main.debug(message);
  }
}

var Template = {
  init: function(app) {
    app.debug("Hello");
  }
}

1 个答案:

答案 0 :(得分:0)

我发现在我的OOP项目中使用Dependency Injection模式和Event Bus模式非常有用。如果使用MVCMVP解耦逻辑,它对单元测试也有很大帮助。