Javascript-如何在多个模块中定义一个类?

Javascript-如何在多个模块中定义一个类?,javascript,oop,refactoring,ecmascript-5,Javascript,Oop,Refactoring,Ecmascript 5,我有一节课,时间越来越长了。我已经确定了多个不同的概念,它们共同赋予我的课程以意义 “MyService”类由以下部分组成:“auth”、“存储”、“数据库””、。。。概念 我认为(也许我错了)在多个文件中定义类“MyService”将是一个很好的重构。比如: MyService/MyService.js 从“/myService”导入myService MyService/Auth.js MyService/Storage.js 我该怎么做?此技术是否有名称/存在?这是重构我的类的好方法吗?

我有一节课,时间越来越长了。我已经确定了多个不同的概念,它们共同赋予我的课程以意义

MyService”类由以下部分组成:“auth”、“存储”、“数据库””、。。。概念

我认为(也许我错了)在多个文件中定义类“MyService”将是一个很好的重构。比如:

MyService/MyService.js 从“/myService”导入myService

MyService/Auth.js

MyService/Storage.js

我该怎么做?此技术是否有名称/存在?这是重构我的类的好方法吗?若有,原因为何?如果没有,为什么

多谢各位

更新 也许,将类拆分为更小的类是最好的主意,但我不知道如何使其能够访问myService功能, 这条线

myService.initializeApp(config);
必须以前在单例上执行过

基于实例的解决方案
/*模拟myService CLI SDK*/
函数myService(){}
myService.key=未定义;
myService.initializeApp=函数(键){
this.key=key;
} 
myService.auth=函数(){
如果(!this.key){
抛出新错误(“请,初始化应用程序”);
}
log(`您有权访问所有身份验证方法!键:${this.Key}`);
}
myService.storage=函数(){
如果(!this.key){
抛出新错误(“请,初始化应用程序”)
}
log(`您可以访问所有存储方法!键:${this.Key}`);
}
/*构成主类的类*/
函数Auth(){
this.auth=myService.auth();
}
Auth.prototype.login=函数(用户名、密码){
log(“登录!”);
}
函数存储(){
this.storage=myService.storage();
}
Storage.prototype.uploadFile=函数(文件,路径){
log(“上传文件!”)
}
/*主类*/
让i初始化=错误;
函数Firebase(){
如果(!isInitialized){//Singleton
myService.initializeApp(“raul”);
this.auth=new auth();//合成
this.storage=new storage();//组合
isInitialized=true;
}
}
常数f=新的火基();
f、 auth.login();

f、 storage.uploadFile()与其在多个模块之间传播
MyService
,不如将其划分为更小的类。你说过:

“MyService”类由:“auth”、“storage”、“database”和。。。概念

因此,有一个类用于auth,另一个用于存储,另一个用于数据库,然后让
MyService
使用这些其他类的实例作为其实现的一部分可能是有意义的

不能将
定义扩展到模块。(您的编辑显示您出于某种原因没有使用
class
语法。)您可以在事后向类添加near方法,如下所示:

class Example {
    // ...
}
然后在另一个模块中:

import Example from "./Example.js";

// (You'd probably have a utility method for this, `addMethod` or similar)
Object.defineProperty(Example.prototype, "methodName", {
    value() {
        // ...method implementation...
    },
    enumerable: false, // (You can leave this off, false is the default)
    configurable: true,
    writable: true,
});
但这样分散定义可能不是最佳做法,而且存在局限性,尤其是在子类中(
super
以这种方式添加的方法不会像
super
类中定义的方法那样工作)。(您的编辑显示您没有使用
class
语法,因此这与您无关。)

因此,我坚持将
MyService
分解成更小的类,这些类可以组合


您可能想知道我为什么使用上面的
Object.defineProperty
,而不仅仅是:

Example.prototype.methodName = function() {
    // ...
};
区别在于可枚举性。如果您使用这样的赋值添加一个方法,它会创建一个可枚举属性,但如果您使用如上所示的
Object.defineProperty
,则不会。我对
可枚举
可配置
可写
使用了与创建方法时使用的
定义相同的标志。下面是一个不同的例子:

class A{}
Object.defineProperty(A.prototype,“示例”{
值(){},
可枚举:false,
对,,
可写:对,
});
B类{}
B.prototype.example=function(){};
常数a=新的a();
log(`typeof a.example=${typeof a.example}`);
log(`a的可枚举非符号属性:`);
让计数=0;
for(a中的常量名称){
log(`*${name}`);
++计数;
}
log(`Total:${count}`);
常数b=新的b();
log(`typeof b.example=${typeof b.example}`);
log(`b的可枚举非符号属性:`);
计数=0;
for(b中的常量名称){
log(`*${name}`);
++计数;
}
log(`Total:${count}`)
。作为控制台包装器{
最大高度:100%!重要;

}
我想这样做,但在我的用例中,主要问题是为了访问this.auth、this.storage或this.database,我必须确保myService.initializeApp(config)已在构造函数的单例中执行。@Raul-如果
myService
是一个较小类的组合,在构造函数中创建其他类的实例之后,我不明白为什么它不能这样做。非常感谢!它起作用了!我已经用你描述的解决方案中的一个示例编辑了这个问题,你能检查它是否与你描述的完全一致吗?另外,为了简单起见,我使用原型,但我会按照你说的方式来做!
class Example {
    // ...
}
import Example from "./Example.js";

// (You'd probably have a utility method for this, `addMethod` or similar)
Object.defineProperty(Example.prototype, "methodName", {
    value() {
        // ...method implementation...
    },
    enumerable: false, // (You can leave this off, false is the default)
    configurable: true,
    writable: true,
});
Example.prototype.methodName = function() {
    // ...
};