如何将多个javascript类中的函数组合到一个对象中
我有一个快速的javascript问题 假设我有RootFile.js 然后我得到了UserApi.js 然后我得到了单独的功能文件,比如eauth.js或profile.js auth.js profile.js 现在我想打电话:如何将多个javascript类中的函数组合到一个对象中,javascript,ecmascript-6,ecmascript-next,Javascript,Ecmascript 6,Ecmascript Next,我有一个快速的javascript问题 假设我有RootFile.js 然后我得到了UserApi.js 然后我得到了单独的功能文件,比如eauth.js或profile.js auth.js profile.js 现在我想打电话: import RootFile from './RootFile' RootFile.userApi.profileLog(); //and RootFile.userApi.authLog(); import RootFile from './RootFile
import RootFile from './RootFile'
RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();
import RootFile from './RootFile'
RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();
我不能让它工作,RootFile.userApi是一种类型的对象,但是authLog是未定义的。
我做错了什么?我不认为使用。。。排列运算符是正确的。尝试改用Object.assign-它接受一个目标对象并将其他对象的所有可枚举属性分配给它
import Auth from './auth';
import Profile from './profile';
let merged = {};
Object.assign(merged, new Auth, new Profile);
export default merged;
我不认为使用。。。排列运算符是正确的。尝试改用Object.assign-它接受一个目标对象并将其他对象的所有可枚举属性分配给它
import Auth from './auth';
import Profile from './profile';
let merged = {};
Object.assign(merged, new Auth, new Profile);
export default merged;
我认为你不想那样做。在它们各自的类中分离逻辑的全部目的是得到一个更结构化、更易于维护的库 我会选择作文:
export default class RootFile {
get userApi() {
// Some logic here?
// Just return a newly created api for now:
return new UserApi;
}
};
对UserApi执行相同的操作:
然后像这样使用它:
rootFile.userApi.profile.log("etc");
为什么是作文?
这样,您就不必担心函数的重新定义。
它更快了,JavaScript引擎现在可以为您的类进行优化,而这对于合并的结构是不可能的。
还要记住,getter的性能不如属性。我认为你应该考虑使用常用的类成员属性 我不认为你想这么做。在它们各自的类中分离逻辑的全部目的是得到一个更结构化、更易于维护的库 我会选择作文:
export default class RootFile {
get userApi() {
// Some logic here?
// Just return a newly created api for now:
return new UserApi;
}
};
对UserApi执行相同的操作:
然后像这样使用它:
rootFile.userApi.profile.log("etc");
为什么是作文?
这样,您就不必担心函数的重新定义。
它更快了,JavaScript引擎现在可以为您的类进行优化,而这对于合并的结构是不可能的。
还要记住,getter的性能不如属性。我认为你应该考虑使用常用类成员的属性 毕竟我所做的事情如下: 我的RootFile.js现在看起来像这样:
import UserApi from './UserApi'
export default class RootFile {
get userApi(){
return UserApi;
}
};
import * as Auth from './auth';
import * as Profile from './profile';
const merged = {
...Auth,
...Profile
}
export default merged;
我摆脱了get,因为@Tim说他们没有那么出色
然后我的UserApi.js现在看起来像这样:
import UserApi from './UserApi'
export default class RootFile {
get userApi(){
return UserApi;
}
};
import * as Auth from './auth';
import * as Profile from './profile';
const merged = {
...Auth,
...Profile
}
export default merged;
没有新的了
然后我得到了单独的功能文件,比如eauth.js或profile.js
auth.js
profile.js
因此,正如@Bergi所建议的,没有更多的类
现在我可以打电话:
import RootFile from './RootFile'
RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();
import RootFile from './RootFile'
RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();
谢谢大家的回答,但这就是我将要做的,毕竟,它工作得很好。我最终做了以下几点: 我的RootFile.js现在看起来像这样:
import UserApi from './UserApi'
export default class RootFile {
get userApi(){
return UserApi;
}
};
import * as Auth from './auth';
import * as Profile from './profile';
const merged = {
...Auth,
...Profile
}
export default merged;
我摆脱了get,因为@Tim说他们没有那么出色
然后我的UserApi.js现在看起来像这样:
import UserApi from './UserApi'
export default class RootFile {
get userApi(){
return UserApi;
}
};
import * as Auth from './auth';
import * as Profile from './profile';
const merged = {
...Auth,
...Profile
}
export default merged;
没有新的了
然后我得到了单独的功能文件,比如eauth.js或profile.js
auth.js
profile.js
因此,正如@Bergi所建议的,没有更多的类
现在我可以打电话:
import RootFile from './RootFile'
RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();
import RootFile from './RootFile'
RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();
谢谢大家的回答,但这就是我将要做的,毕竟,它工作得很好。我看到了。。。在的回答中使用spread运算符,所以我将尝试一下,几分钟后让您知道@SudoPlz:BabelV6的最新版本在默认情况下不再包括第2阶段和以后的建议中的功能-我认为您链接的答案是在该版本发布之前。现在,您必须在.babelrc配置以及标准ES2015配置中包含。确实,spread运算符不是ES6,也不会出现在ES7中,但是Object.assign没有任何不同,它仍然无法工作。我看到了。。。在的回答中使用spread运算符,所以我将尝试一下,几分钟后让您知道@SudoPlz:BabelV6的最新版本在默认情况下不再包括第2阶段和以后的建议中的功能-我认为您链接的答案是在该版本发布之前。现在,您必须在.babelrc配置以及标准ES2015配置中包含。确实,spread运算符不是ES6,也不会出现在ES7中,但是Object.assign没有任何不同,它仍然不起作用。将会有很多很多函数,我真的想把它们分散在不同的文件中。。此外,由于它们都是UserApi的一部分,而且还会有其他类型的API,因此我希望避免为每个功能使用单独的名称。我理解,您可以在嵌套API时多次使用此模式。这样,您就不必担心函数的重新定义。还要记住,getter的性能不如属性。我认为你应该考虑使用常用的类成员的属性。谢谢你回答这个问题的时间,但是我真的想调用RooFiel.UsRAPI.PrimeLeGoG,而不是把它与Primel.LoG分开。
如果是这样的话,我会把它们扔了我不知道,谢谢!好吧也许如果你能告诉我你为什么要这样做,我可以提供进一步的帮助。@SudoPlz:如果你只是想把一个大类扩展到多个文件上,你应该让这些文件只导出方法,而不是一个完整的类。会有很多很多函数,我真的想把它们扩展到单独的文件中。。此外,由于它们都是UserApi的一部分,而且还会有其他类型的API,因此我希望避免为每个功能使用单独的名称。我理解,您可以在嵌套API时多次使用此模式。这样,您就不必担心函数的重新定义。还要记住,getter的性能不如属性。我认为你应该考虑使用常用的类成员的属性。谢谢你回答这个问题的时间,但是我真的想调用RooFiel.UsRAPI.PrimeLeGoG,而不是把它与Primel.LoG日志联系起来。好吧也许如果你能告诉我为什么要这样做,我可以提供进一步的帮助。@SudoPlz:如果你只是想将一个大类分散到多个文件上,你应该让这些文件只导出方法,而不是一个完整的类。profileLog和authLog是继承的方法,不会被Object.assign或property spread操作符复制。但是,您实际上并不希望在一个对象中组合多个彼此无关的类。如果它们应该是可组合的,就让它们混合起来。@Bergi你能写一个答案来解释正确的方法吗?我甚至不知道你为什么要这样做,所以我不知道正确的方法是什么。这些东西应该是单身吗?如果没有类,你会如何编写它们呢?你看,也许它们不必是类,我真正想要实现的是,有一组与概要文件有关的函数,另一组与auth有关的函数,另一组与其他东西有关的函数等等。。我希望最终能够以一种干净的方式从我的UserApi引用所有这些函数,而不必为每个函数编写单独的getter。来自C++、java和Objto-C,JavaScript在没有类的情况下对我来说总是很奇怪,所以这就是为什么我会被混淆。PrimeLeLogo和AuthLogo是继承的方法,不会被Objt.Advices或属性扩展操作符复制。但是,您实际上并不希望在一个对象中组合多个彼此无关的类。如果它们应该是可组合的,就让它们混合起来。@Bergi你能写一个答案来解释正确的方法吗?我甚至不知道你为什么要这样做,所以我不知道正确的方法是什么。这些东西应该是单身吗?如果没有类,你会如何编写它们呢?你看,也许它们不必是类,我真正想要实现的是,有一组与概要文件有关的函数,另一组与auth有关的函数,另一组与其他东西有关的函数等等。。我希望最终能够以一种干净的方式从我的UserApi引用所有这些函数,而不必为每个函数编写单独的getter。来自C++、java和Objto-C,JavaScript在没有类的情况下对我来说总是很奇怪,所以这可能是我困惑的原因。更好的是,您应该使用命名导出,而不是默认导出对象。您仍然可以从“/Auth”导入*作为Auth@Bergi只是改变了我的回答,以反映:谢谢。我已经简化了一点:-我不确定你是否真的需要两个不同的文件RootFile和UserApi,目前看起来你应该把它们合并成一个。谢谢@Bergi,但你知道我想在RootFile构造函数中运行代码。我想传递令牌并将其保存在其中的属性中。此外,还将不仅仅是userApi,因此根文件必须包含所有其他api。我希望能够运行RootFiletoken.userApi.whateverFunction;和RootFiletoken.whateverApi.whateverFunction;好的,当然,然后将RootFile设置为构造函数/工厂;你只是以前从来没有在你的问题或回答中这样使用过。虽然在我看来还是很奇怪;为什么可实例化对象会有静态…Api属性?更好的是:您应该使用命名导出而不是默认导出对象。您仍然可以从“/Auth”导入*作为Auth@Bergi只是改变了我的回答,以反映:谢谢。我已经简化了一点:-我不确定你是否真的需要两个不同的文件RootFile和UserApi,目前看起来你应该把它们合并成一个。谢谢@Bergi,但你知道我想在RootFile构造函数中运行代码。我想传递令牌并将其保存在其中的属性中。也有 l不仅仅是userApi,因此根文件必须包含所有其他API。我希望能够运行RootFiletoken.userApi.whateverFunction;和RootFiletoken.whateverApi.whateverFunction;好的,当然,然后将RootFile设置为构造函数/工厂;你只是以前从来没有在你的问题或回答中这样使用过。虽然在我看来还是很奇怪;为什么可实例化对象会具有静态…Api属性?