ES-2015模块是否可以自我感知?

3
在JavaScript ES-2015模块中,一个模块成员能否知道其他模块成员都有哪些呢?
例如,在CommonJS模块中,这是可能的:
function square(x) {
    return x * x;
}
function whoAmI() {
    return Object.keys(module.exports); // ['square','whoAmI']
}
module.exports = {
    square: square,
    whoAmI: whoAmI
};

在等价的 ES-2015 模块中,我们如何编写 whoAmI() 函数?

export function square(x) {
    return x * x;
}
export function whoAmI() {
    // ?????
}
1个回答

5
你可以从自己导入*,并导出结果的Object.keys对象:
// myModule.js
import * as exports from './myModule';

export function square(x) { return x * x; }
export let whoAmI = Object.keys(exports);

// consumer.js
import {whoAmI} from `./myModule';
console.log(whoAmI);

> ['square']

这个不会包括whoAmI,所以要包含它:

export let whoAmI = Object.keys(exports).concat('whoAmI');

不要忘记 whoAmI 也需要返回自身。因此输出应为 ['square','whoAmI'] - 4castle
1
顺便提一下,这种循环自依赖是完全合法的。相关问题 - 4castle
@torazaburo,为什么whoAmI不会包含在输出键中呢?(我同意@4castle的观点,认为它应该包含在内。) - Constablebrew
@Constablebrew 嗯,不是这样的,因为循环导入的解析方式不同。 - user663031

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接