2016-08-31 2 views
0

Я хочу начать писать лучший код, и я понял, что все, что связано с определенной функциональностью внутри объекта, является хорошей идеей.Преобразование кода в 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(); 

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

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

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

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

+0

Почему? Для чего? –

+0

«* все, что связано с определенной функциональностью внутри объекта, является хорошей идеей *» - нет, это не так. По крайней мере, не в общем. – Bergi

+0

Где еще вы собираетесь использовать любую из этих трех переменных? Это весь ваш код? Как вы думаете, что вы получите от объекта 'app'? – Bergi

ответ

3

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

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(); 
+0

Я попытался применить этот подход, и соответствующим образом отредактировал мой вопрос. – Robin

+0

@Robin Ваш подход неправильный. См. Мой ответ, я добавил точный код, который вы ищете. –

Смежные вопросы