当前位置:首页 > JavaScript

js ioc实现

2026-03-13 22:44:25JavaScript

实现 JavaScript 的 IOC(控制反转)

在 JavaScript 中实现 IOC(控制反转)通常依赖依赖注入(DI)模式,通过将依赖关系的创建和管理从组件内部转移到外部容器。以下是几种常见实现方式:

手动依赖注入

通过构造函数或属性显式注入依赖项,避免在组件内部直接实例化依赖对象。

class Logger {
  log(message) {
    console.log(message);
  }
}

class UserService {
  constructor(logger) {
    this.logger = logger;
  }

  getUser(id) {
    this.logger.log(`Fetching user ${id}`);
    return { id, name: 'John Doe' };
  }
}

const logger = new Logger();
const userService = new UserService(logger);
userService.getUser(1);

使用 IOC 容器

通过第三方库(如 inversifyawilix)管理依赖关系,自动解析和注入依赖。

使用 inversify 示例

import { Container, injectable, inject } from 'inversify';

@injectable()
class Logger {
  log(message) {
    console.log(message);
  }
}

@injectable()
class UserService {
  constructor(@inject('Logger') private logger) {}

  getUser(id) {
    this.logger.log(`Fetching user ${id}`);
    return { id, name: 'John Doe' };
  }
}

const container = new Container();
container.bind('Logger').to(Logger);
container.bind('UserService').to(UserService);

const userService = container.get('UserService');
userService.getUser(1);

基于装饰器的自动注入

通过装饰器(如 tsyringe)简化依赖注入的声明和解析。

import { container, injectable, inject } from 'tsyringe';

@injectable()
class Logger {
  log(message) {
    console.log(message);
  }
}

@injectable()
class UserService {
  constructor(@inject(Logger) private logger) {}

  getUser(id) {
    this.logger.log(`Fetching user ${id}`);
    return { id, name: 'John Doe' };
  }
}

const userService = container.resolve(UserService);
userService.getUser(1);

工厂模式实现

通过工厂函数动态创建依赖对象,实现控制反转。

js ioc实现

class Logger {
  log(message) {
    console.log(message);
  }
}

function createUserService(logger) {
  return {
    getUser(id) {
      logger.log(`Fetching user ${id}`);
      return { id, name: 'John Doe' };
    }
  };
}

const logger = new Logger();
const userService = createUserService(logger);
userService.getUser(1);

选择建议

  • 简单场景:手动注入或工厂模式足够轻量。
  • 复杂项目:使用 inversifytsyringe 等库,支持生命周期管理和模块化配置。
  • TypeScript 项目:优先选择基于装饰器的方案(如 tsyringe),类型提示更完善。

标签: jsioc
分享给朋友:

相关文章

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…