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

时间:2016-04-07 15:25:21

标签: javascript ecmascript-6 ecmascript-next

我有一个快速的JavaScript问题。

说我有RootFile.js

import UserApi from './UserApi'
export default class RootFile {

  get userApi() {
    return UserApi;
  }
};

然后我得到UserApi.js

import Auth from './auth';
import Profile from './profile';

const merged = {
  ...new Auth, 
  ...new Profile 
}

export default merged;

然后我获得了单独的功能文件,例如auth.jsprofile.js

auth.js

export default class Auth{
  authLog(){
    console.log("DONE");
    //Gotta find a way to run this.
  }
}

profile.js

export default class Profile{
  profileLog(){
    console.log("DONE");
    //Gotta find a way to run this.
  }
}

现在我希望能够致电:

import RootFile from './RootFile'

RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();

我无法让它工作,RootFile.userApiobject的类型,但authLogundefined。 我做错了什么?

3 个答案:

答案 0 :(得分:3)

毕竟我最终做的是:

我的RootFile.js现在看起来像这样:

import UserApi from './UserApi'
export default class RootFile {

    get userApi(){
        return UserApi;
    }
};

我摆脱了get,因为@Tim说他们不是那么高效。

然后我的UserApi.js现在看起来像这样:

import * as Auth from './auth';
import * as Profile from './profile';

const merged = {
  ...Auth, 
  ...Profile 
}

export default merged;

不再new

然后我获得了单独的功能文件,例如auth.jsprofile.js

auth.js

export function authLog(){
    console.log("auth test ");
},
export default auth;

profile.js

export function profileLog(){
    console.log("profile test ");
} 
export default profile;

所以没有更多的课程,正如@Bergi建议的那样。

现在我可以致电:

import RootFile from './RootFile'

RootFile.userApi.profileLog();
//and
RootFile.userApi.authLog();

谢谢大家的答案,但毕竟我会这样做,效果很好。

答案 1 :(得分:0)

我不认为使用...点差运算符是正确的。尝试使用Object.assign - 它需要一个目标对象并将其他对象的所有可枚举属性分配给它。

import Auth from './auth';
import Profile from './profile';

let merged = {};
Object.assign(merged, new Auth, new Profile);

export default merged;

答案 2 :(得分:0)

我认为你不想这样做。在各自的类中分离逻辑的关键在于获得更结构化和更易维护的库。

我会选择合成:

export default class RootFile  {

  get userApi() {
    // Some logic here?

    // Just return a newly created api for now:
    return new UserApi;
  }
};

UserApi执行相同的操作:

export default class UserApi {

  get profile() {
    return new Profile;
  }
};

并像这样使用它:

rootFile.userApi.profile.log("etc");

为什么要组成?

  • 这样您就不必担心功能的重新定义。
  • 速度更快,JavaScript引擎现在可以针对您的类进行优化,而这对于合并的构造是不可能的。

还要记住,getter的性能低于属性。我认为你应该考虑为常用的类成员

使用属性