2016-11-17 3 views
3

В модулях ES-2015 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() { 
    // ????? 
} 

ответ

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'); 
+0

Не забудьте что 'whoAmI' также должен вернуться сам. Таким образом, вывод: '['square', 'whoAmI']' – 4castle

+0

Кстати, эта круговая самозависимость совершенно законна. [Связанный вопрос] (http://stackoverflow.com/q/40240659/5743988) – 4castle

+0

@torazaburo, почему бы не «whoAmI» быть включенным в ключи экспорта? (Я согласен с @ 4castle и считаю, что так будет.) – Constablebrew