您可以实现一个模块,为您提供问题建议的类似使用模式,audio()
用于访问音频对象,并且canPlay
无需函数调用。这可以通过在函数中运行Audio
构造函数来完成,正如 Asad 建议的那样,然后在每次您希望访问它时调用该函数。对于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``
(如此处所示:Invoking a function without parentheses),这可以被认为更令人困惑。
最后,其他不涉及数组索引或函数调用的全局变量必须以与let audio = () => new Audio();
.