如何从ES6的CBook类中访问MyClass类的所有方法与变量?
如何在CBook类中访问MyClass的所有函数与变量
首先看你现有的代码,其实已经迈出了关键一步——在MyClass的构造函数里把自身实例this传给了CBook的构造函数,这是让CBook访问MyClass实例成员的基础。接下来我们分情况处理不同类型的成员:
1. 访问MyClass的实例方法和公共属性
你已经在CBook的构造函数里拿到了MyClass的实例myClass,只需要保存这个引用,之后就能直接调用实例方法或者访问公共属性了:
class CBook { constructor(myClass) { // 把MyClass实例保存起来,方便后续方法使用 this.myClassInstance = myClass; // 直接调用MyClass的实例方法 this.myClassInstance.describeBook(); // 会在控制台输出'test' } // 后续方法里也能访问 someMethod() { this.myClassInstance.describeBook(); } } export {CBook};
2. 访问MyClass模块里的顶层变量(比如path)
你现在的path是定义在MyClass模块的顶层,不属于MyClass类的成员,所以要让CBook访问它,需要先把它导出,再在CBook里导入:
修改MyClass的代码,导出path:
import $ from 'jquery'; import {CBook} from './book'; // 导出顶层变量path export const path = "http://www.mypage.com"; class MyClass { constructor() { let _summaryPageUI = new CBook(this); } describeBook() { console.log('test'); } } new MyClass(); export {MyClass};
然后在CBook里导入并使用:
// 导入MyClass模块里的path(替换成你的MyClass模块文件名) import { path } from './myclass'; class CBook { constructor(myClass) { console.log(myClass); console.log(path); // 现在可以访问这个变量了 } } export {CBook};
3. 访问MyClass的静态方法/属性
如果MyClass有静态成员(比如类级别的方法或属性),你需要在CBook里导入MyClass类,然后直接通过类名访问:
先给MyClass添加静态成员:
class MyClass { // 静态方法 static logInfo() { console.log('这是MyClass的静态方法'); } // 静态属性 static baseUrl = "http://example.com"; constructor() { let _summaryPageUI = new CBook(this); } describeBook() { console.log('test'); } }
然后在CBook里导入并使用:
import { MyClass } from './myclass'; class CBook { constructor(myClass) { // 调用静态方法 MyClass.logInfo(); // 访问静态属性 console.log(MyClass.baseUrl); } } export {CBook};
4. 访问MyClass的私有成员
如果MyClass里有带#前缀的私有变量或方法(比如#privateData、#privateFunc()),这些成员只能在MyClass内部访问。如果需要让CBook访问,你得在MyClass里写公共的getter或者方法来暴露它们:
修改MyClass:
class MyClass { // 私有属性 #privateNote = '这是私有内容'; // 私有方法 #privateLog() { console.log('私有方法被调用'); } // 暴露私有属性的getter get privateNote() { return this.#privateNote; } // 暴露私有方法的公共接口 triggerPrivateLog() { this.#privateLog(); } constructor() { let _summaryPageUI = new CBook(this); } describeBook() { console.log('test'); } }
然后在CBook里访问:
class CBook { constructor(myClass) { // 通过getter获取私有属性 console.log(myClass.privateNote); // 通过公共方法调用私有方法 myClass.triggerPrivateLog(); } } export {CBook};
关于循环导入的注意事项
你的代码里MyClass导入了CBook,如果之后CBook又导入MyClass的内容,会形成循环导入。ES6模块是支持循环导入的,但要注意:
- 不要在CBook的模块顶层直接使用导入的MyClass内容(比如在类外面直接调用
MyClass.logInfo()),因为此时MyClass可能还没初始化完成。 - 把导入内容的使用放在函数内部(比如构造函数、类方法里),这样能确保模块已经初始化完毕。
内容的提问来源于stack exchange,提问作者wawanopoulos
相关产品推荐
相关产品推荐

