JavaScript中如何创建多对多引用实现用户关注逻辑
JavaScript 实现多对多用户关注关系方案
要实现双向绑定的多对多关注关系,同时支持类.append()的集合调用风格,核心是自定义封装关系集合,自动维护双向关联,避免手动操作两边数据导致不一致。
核心实现
我们可以继承JS原生的Set来实现专属的关系集合——Set本身自带值去重特性,天然适合存储关注关系(不会出现重复关注的脏数据),在此基础上扩展append方法自动同步双向关系:
class FollowRelationSet extends Set { constructor(owner, type) { super(); this.owner = owner; // 集合所属的用户实例 this.type = type; // 标记集合类型:followers=粉丝列表,following=关注列表 } append(target) { // 边界处理:不能关注自己 if (target === this.owner) throw new Error("无法关注自己"); // 已存在关系直接返回,避免重复操作 if (this.has(target)) return this; if (this.type === "followers") { // 给当前用户粉丝列表加目标 = 目标用户关注当前用户 super.add(target); target.following.add(this.owner); } else if (this.type === "following") { // 给当前用户关注列表加目标 = 当前用户关注目标用户 super.add(target); target.followers.add(this.owner); } return this; // 支持链式调用 } // 配套实现取消关注方法,逻辑和append反向 remove(target) { if (!this.has(target)) return this; if (this.type === "followers") { super.delete(target); target.following.delete(this.owner); } else if (this.type === "following") { super.delete(target); target.followers.delete(this.owner); } return this; } }
接下来定义User类,初始化时自动创建粉丝和关注两个关系集合:
class User { constructor(username) { this.username = username; this.followers = new FollowRelationSet(this, "followers"); this.following = new FollowRelationSet(this, "following"); } }
使用效果
完全支持你需要的调用风格,双向关系会自动维护,不需要手动操作两边数据:
const user = new User("user"); const other = new User("other"); // 调用你期望的方法:给user的粉丝列表追加other = other关注user user.followers.append(other); console.log(user.followers.has(other)); // true console.log(other.following.has(user)); // true 双向关系自动同步 // 如果要实现user关注other,语义化调用如下 user.following.append(other); console.log(user.following.has(other)); // true console.log(other.followers.has(user)); // true
注意事项
- 所有关系的增删操作请统一走
append/remove方法,不要直接用Set原生的add/delete,否则会破坏双向关联的一致性 - 上述实现是符合通用语义的设计:
followers存所有关注当前用户的粉丝,following存当前用户主动关注的对象。如果你硬要让user.followers.append(other)的语义是user关注other,只需要调整append方法内的同步逻辑即可,但非常不推荐这种语义和属性名脱节的设计,后续维护极易出bug。
内容的提问来源于stack exchange,提问作者Giuliano Mirabella
相关产品推荐
相关产品推荐

