Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将多个javascript类中的函数组合到一个对象中_Javascript_Ecmascript 6_Ecmascript Next - Fatal编程技术网

如何将多个javascript类中的函数组合到一个对象中

如何将多个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

我有一个快速的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'

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属性?