Javascript-如何在多个模块中定义一个类?
我有一节课,时间越来越长了。我已经确定了多个不同的概念,它们共同赋予我的课程以意义 “MyService”类由以下部分组成:“auth”、“存储”、“数据库””、。。。概念 我认为(也许我错了)在多个文件中定义类“MyService”将是一个很好的重构。比如: MyService/MyService.js 从“/myService”导入myService MyService/Auth.js MyService/Storage.js 我该怎么做?此技术是否有名称/存在?这是重构我的类的好方法吗?若有,原因为何?如果没有,为什么 多谢各位 更新 也许,将类拆分为更小的类是最好的主意,但我不知道如何使其能够访问myService功能, 这条线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.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() {
// ...
};