Конвертировать код в 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();