浏览器JS中存储在ClassA内的ClassB实例如何访问对应父实例
方案说明
你担心的b.parent = this_instance_of_a会创建a的副本的问题完全不存在:JS中对象是引用类型,赋值操作只会传递内存指针,不会生成新的对象副本,直接绑定父实例引用是这类关联场景最常用、性能最高的实现方式。
可运行的修改后代码
class A { constructor() { this.myval = "this is my value"; this.instances_of_b = []; } spawn_an_instance_of_b() { // 创建b实例时将当前a实例作为参数传入 const bInstance = new B(this); this.instances_of_b.push(bInstance); } } class B { // 构造函数接收父级a实例,挂载到自身属性上 constructor(parentA) { this.parentA = parentA; } read_myval_from_a() { // 直接读取已挂载的父实例即可 alert(this.parentA.myval); } } const myA = new A(); myA.spawn_an_instance_of_b(); myA.instances_of_b[0].read_myval_from_a();
无属性污染的可选方案
如果你不希望给B实例新增额外属性、需要保持实例属性干净,可以用WeakMap存储关联关系,不会影响垃圾回收也没有内存泄漏风险:
const bToAMap = new WeakMap(); class A { constructor() { this.myval = "this is my value"; this.instances_of_b = []; } spawn_an_instance_of_b() { const bInstance = new B(); bToAMap.set(bInstance, this); this.instances_of_b.push(bInstance); } } class B { read_myval_from_a() { const parentA = bToAMap.get(this); alert(parentA.myval); } }
内容的提问来源于stack exchange,提问作者MirceaKitsune
相关产品推荐
相关产品推荐

