创建一个音频元素并在对象字面量中赋予它属性

Create an audio element and give it properties inside an object literal

我正在努力摆脱编写意大利面条式代码的坏习惯。我在 modular javascript 上找到了一个很棒的教程,我正在尝试将其应用到我的一个项目中。

我有这个:

var sfx = {}

sfx.mySound1 = document.createElement('audio');
sfx.mySound1.src = 'https://some-url.ogg';
sfx.mySound1.moreProps = "...";

sfx.mySound2 = document.createElement('audio');
sfx.mySound2.src = 'https://some-url.ogg';
sfx.mySound2.moreProps = "...";

在另一个对象中我可以播放这样的音效:

sfx.mySound1.play();

我想实现同样的事情,但我想使用对象文字模式:

const sfx = {
    mySound1: {
        // create audio element
        // give it props
    },
    mySound2: {
        // create audio element
        // give it props
    }
}

我似乎无法弄清楚如何创建音频元素并在同一对象中为其赋予属性。也许这违背了逻辑,不应该起作用。如果是这样,我应该如何编写它而不是将其全部保存在 sfx object?

是的,您将无法在对象定义中创建元素并更改其属性。我觉得你原来的做法很好。

如果你真的想,你可以:

const sfx = {
    mySound1: document.createElement('audio'),
    mySound2: document.createElement('audio')
}

sfx.mySound1.src = 'https://some-url.ogg';
sfx.mySound1.moreProps = "...";

sfx.mySound2.src = 'https://some-url.ogg';
sfx.mySound2.moreProps = "...";

你可能会觉得奇怪,在单独的对象中设置属性,然后使用这些对象覆盖元素对象的属性,但那会很奇怪,很奇怪 ;)

试试这个:

var sfx = {
  mySound1: Object.assign(document.createElement('audio'), {
    src: 'https://some-url.ogg',
    moreProps: '...'
  }),

  mySound2: Object.assign(document.createElement('audio'), {
    src: 'https://some-url.ogg',
    moreProps: '...'
  })
}

The Object.assign() method is used to copy the values of all enumerable own properties from one or more source objects to a target object. It will return the target object.

看起来很清楚,但请参阅 Object.assign() 文档了解浏览器兼容性和 polyfill。