依赖注入是一种将组件所需依赖从外部传入而不是在内部直接创建的设计方式。在JavaScript里运用它,可以明显减少模块间的硬绑定,让代码更容易测试和替换实现,从而提升整体可维护性。

为什么需要依赖注入
当模块在内部直接通过 new 或 require 固定依赖时,调用方和被依赖方就被绑死。一旦依赖逻辑变化,就要改动多处。通过依赖注入,可以把依赖的创建和使用分开,符合控制反转的思想。
常见的注入方式
构造函数注入
在创建对象时把依赖作为构造参数传入,是最直观的方式。
// 日志服务
function Logger() {
this.log = function (msg) {
console.log('[log] ' + msg);
};
}
// 用户服务依赖 Logger
function UserService(logger) {
this.logger = logger;
this.addUser = function (name) {
this.logger.log('add user: ' + name);
};
}
var logger = new Logger();
var userService = new UserService(logger);
userService.addUser('tom');
函数参数注入
把依赖作为函数参数传入,适合无状态工具函数或一次性调用。
function sendEmail(transporter, to, content) {
return transporter.send(to, content);
}
var mockTransporter = {
send: function (to, content) {
console.log('mock send to ' + to);
}
};
sendEmail(mockTransporter, 'a@ipipp.com', 'hello');
使用简单容器管理依赖
当依赖变多,可以写一个极简容器来集中注册和获取实例。
var container = {
instances: {},
register: function (name, instance) {
this.instances[name] = instance;
},
get: function (name) {
return this.instances[name];
}
};
function Db() {}
container.register('db', new Db());
function UserRepo(db) {
this.db = db;
}
var repo = new UserRepo(container.get('db'));
注意事项
- 避免注入过多依赖,说明类职责可能过重
- 优先使用接口或约定而非具体实现,便于替换
- 测试时传入模拟对象,能验证调用而不依赖真实环境
合理运用依赖注入,可以让JavaScript项目的结构更清晰,修改功能时影响范围更小,长期维护更加轻松。
JavaScript依赖注入可维护性控制反转模块化修改时间:2026-07-24 17:51:18