You need to enable JavaScript to run this app. 浏览器JS中存储在ClassA内的ClassB实例如何访问对应父实例
优惠活动
大模型
产品
解决方案
定价
更多

浏览器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 20:54:04