Конвертировать код в JS Object Literal Pattern

Я хочу начать писать лучший код и понял, что помещать все, что имеет отношение к определенному элементу функциональности внутри объекта, - хорошая идея.

Изменить: я пытался принять концепцию в ответе @SoftwareEngineer171. Теперь у меня есть это:

var app = {
    audioCtx : new(window.AudioContext || window.webkitAudioContext)(),

    init : function () {
        oscillator = app.audioCtx.createOscillator();
        oscillator.type = 'square';
        oscillator.frequency.value = 3000; // value in hertz
        oscillator.start();
    }
} // app object close

app.init();

Но это не работает. Кто-нибудь может объяснить почему?

Я хочу использовать этот код как часть приложения, но помещенный в литерал объекта:

var context = new AudioContext(), 
    gainNode = context.createGain(), 
    oscillator = context.createOscillator();

gainNode.connect(context.destination);
oscillator.frequency.value = 440;
oscillator.connect(gainNode);
oscillator.start();

Однако, когда я попробовал, я столкнулся с проблемами, упомянутыми здесь.

Я хочу, чтобы код начинался так:

var app = {
    context : new AudioContext(),
    ...
}

Любая помощь высоко ценится как обычно.

1 ответ

Решение

То, что вы пытаетесь сделать, не является определенной частью функциональности, но вы можете сделать это несколькими способами. Например, если вы хотите написать следующий объект

var obj = {
    a: 5,
    b: 7,
    c: a + b
};

это бросит ReferenceError, Чтобы избежать этого, перепишите синтаксис следующим образом

var obj = {
    a: 5,
    b: 7,
    init(){
        this.c = this.a + this.b;
        return this;
    }
}.init();

Вы также можете сделать это с помощью класса

var obj = new class{
    constructor(){
        this.a = 5;
        this.b = 7;
        this.c = this.a + this.b;
    }
}();

или даже используя функцию конструктора

var obj = new function(){
    this.a = 5;
    this.b = 7;
    this.c = this.a + this.b;
}();

редактировать

В вашем случае скрипт аудио контекста будет выглядеть так (см. Также JSFiddle):

var app = {
  context: new (window.AudioContext || window.webkitAudioContext)(),
  gainNode: null,
  oscillator: null,
  init(){
    this.gainNode = this.context.createGain();
    this.oscillator = this.context.createOscillator();
    this.gainNode.connect(this.context.destination);
    this.oscillator.frequency.value = 440;
    this.oscillator.connect(this.gainNode);
    this.oscillator.start();
  }
};

app.init();
Другие вопросы по тегам