JavaScript中如何在匿名内部类的构造函数中获取外部类实例
JavaScript中如何在匿名内部类的构造函数中获取外部类实例
我来帮你解决这个问题!先看看你给出的场景代码:
class Outer{ constructor() { this.fruit = "orange"; let inner = new this.Inner(); } Inner = class{ constructor() { // 在这里怎么获取外部Outer的实例? } } } let outer = new Outer();
你想在Inner的构造函数里拿到当前的Outer实例,又不想通过传参或者额外变量的方式——其实利用JavaScript的闭包特性,结合你现在用的类字段语法(Inner = class{...}),完全可以做到!
核心原理
你现在是用类字段来定义Inner类的,这种写法下,每个Outer实例创建时,都会生成一个对应的Inner类,而且这个Inner类的作用域链里包含了当前Outer实例的上下文——也就是说,在定义Inner类的那个作用域里,this指向的就是当前的Outer实例!我们只要把这个this捕获下来,就能在Inner的构造函数里通过闭包访问到它。
具体实现方法
方法一:立即执行函数捕获外部实例(最稳妥)
用一个立即执行函数把Outer的实例保存下来,然后返回Inner类,这样Inner的构造函数就能直接访问到这个外部实例,同时还能保证Inner实例的this指向自己:
class Outer { constructor() { this.fruit = "orange"; let inner = new this.Inner(); } // 用立即执行函数捕获当前Outer实例 Inner = (function() { const outerInstance = this; return class { constructor() { console.log(outerInstance.fruit); // 输出 "orange" console.log("外部类实例:", outerInstance); // 拿到完整的Outer实例 } }; }).call(this); // 确保立即执行函数的this指向当前Outer实例 } let outer = new Outer();
方法二:直接利用类字段作用域(更简洁)
其实在类字段的作用域里,this本身就是Outer实例,我们可以直接把它存到变量里,Inner类的构造函数就能通过闭包访问到这个变量:
class Outer { constructor() { this.fruit = "orange"; let inner = new this.Inner(); } // 类字段作用域中直接捕获Outer实例 Inner = (() => { const outerThis = this; return class { constructor() { console.log(outerThis.fruit); // 输出"orange" } }; })(); }
不推荐的方法(易混淆上下文)
还有一种方式是通过bind改变Inner构造函数的this指向,但这样会让Inner实例的this直接变成Outer实例,混淆了两个类的上下文,除非你有特殊业务需求,否则不建议使用:
class Outer{ constructor() { this.fruit = "orange"; // 把Outer实例绑定到Inner构造函数的this上 let inner = new (this.Inner.bind(this))(); } Inner = class{ constructor() { console.log(this.fruit); // 输出"orange",但此时this是Outer实例,而非Inner实例 } } }
总结
最推荐的是利用闭包捕获外部实例的方法,既不需要传参,也不会混淆两个类的this上下文,完美匹配你的需求——核心就是利用类字段语法的作用域特性,让Inner类能访问到Outer实例的上下文。
备注:内容来源于stack exchange,提问作者user29708603
相关产品推荐
相关产品推荐

