Вы можете реализовать модуль, чтобы предоставить вам аналогичную схему использования, предложенную вашим вопросом, используя audio()
для доступа к аудиообъекту и canPlay
, без вызова функции.Это можно сделать, запустив конструктор Audio
в функции, как предложил Асад, и затем вызывая эту функцию каждый раз, когда вы хотите получить к ней доступ.Для canPlay
мы можем использовать Proxy , позволяющий выполнять индексацию массива под капотом как функцию.
Давайте предположим, что мы создаем файл audio.js
:
let audio = () => new Audio();
let canPlay = new Proxy({}, {
get: (target, name) => {
switch(name) {
case 'ogg':
return audio().canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, '');
case 'mp3':
return audio().canPlayType('audio/mpeg; codecs="mp3"').replace(/^no$/, '');
}
}
});
export {audio, canPlay}
Это результаты работы с различными index.js
файлами, rollup index.js -f iife
:
import {} from './audio';
(function () {
'use strict';
}());
import {audio} from './audio';
console.log(audio());
(function () {
'use strict';
let audio = () => new Audio();
console.log(audio());
}());
import {canPlay} from './audio';
console.log(canPlay['ogg']);
(function () {
'use strict';
let audio = () => new Audio();
let canPlay = new Proxy({}, {
get: (target, name) => {
switch(name) {
case 'ogg':
return audio().canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, '');
case 'mp3':
return audio().canPlayType('audio/mpeg; codecs="mp3"').replace(/^no$/, '');
}
}
});
console.log(canPlay['ogg']);
}());
Дополнительно,Нет способа реализовать audio
, как первоначально предполагалось, если вы хотите сохранить свойства, описанные в вопросе.Другими короткими возможностями для audio()
являются +audio
или audio``
(как показано здесь: Вызов функции без скобок ), что можно считать более запутанным.
Наконец,другие глобальные переменные, которые не включают индекс массива или вызов функции, должны быть реализованы аналогично let audio = () => new Audio();
.