背景
現在個人的にMixxxというDJソフトのスクリプトを書いているのですが、どうしても「<任意の関数> is not function」というエラーがでてしまい、コレはもしかして自分のコードの書き方が原因なのではと思ったので質問させていただきます。(Mixxxのスクリプトは正確にはQtScript4ではありますが、ECMA-262 5th Editionの仕様に則っているため、JavaScriptのタグをつけさせていただきました。)
問題点
問題のソースを一部抜粋します。
JavaScript
1numarkNV.activeButtons = {};
JavaScript
1numarkNV.unShiftedButtons = { 2 play: function play (channel, control, value, status, group) { 3 if (value) { 4 engine.setParameter(group, 'play', !(engine.getParameter(group, 'play'))); 5 } 6 },
JavaScript
1numarkNV.shiftedButtons = { 2 play: function (channel, control, value, status, group) { 3 if (value) { 4 engine.setParameter(group, 'play_stutter', !(engine.getParameter(group, 'play_stutter'))); 5 } 6},
JavaScript
1numarkNV.shiftButton = function (channel, control, value, status, group) { 2 // This function mapping to Shift button 3 if (!value) return; 4 numarkNV.activeButtons = numarkNV.shiftedButtons //※: この行はオリジナルにはありませんが、説明のために書き足しました。
オリジナルのソースコードはgithubで公開しております
なぜコノような関数の宣言方法をしているのかというと、このMIDIコントローラーはそれのShiftキーを押した際に振る舞いが変化するためです。
振る舞いの変化のさせ方は、shiftキーが押されている間はnumarkNV.activeButtonsオブジェクトにnumarkNV.shiftedButtonsオブジェクトを参照するようにさせるというアプローチをしております。
が、Shiftキーを押しながら再生ボタンを押しても振る舞いが変化すること無く、お察しかもしれませんが、MixxxのログでnumarkNV.activeButton.play is not function
と叱られて動作しません。
質問
ここでようやく質問なのですが、
- このような関数の宣言はやはり間違っているのでしょうか。
- 間違っているとすれば、どのような関数の宣言が適切なのでしょうか。
私個人としては、
javascript
1numarkNV.unShiftedButton.prototype.play = function play (channel, control, value, status, group) { 2 if (value) { 3 engine.setParameter(group, 'play', !(engine.getParameter(group, 'play'))); 4 }
という具合で、prototypeを使って関数を登録するべきなのかと思っているのですが、
「あれ? そもそもオブジェクト生成時にprototypeは生成されたっけ?」
と、少し自信が無いです。
javascript/es5 at es5-deprecated · airbnb/javascriptを眺めながらそんな気はするものの、闇雲にスクリプトを書いて実行してトライアンドデバッグするのも少々疲れてきてしまっていて開発が停滞中のため、少しteratailの皆様のお知恵を拝借しようと思った次第でございます。
以上です。長々とした質問、かつインターネットブラウザにおけるJavaScriptの質問ではないのに最後までお読みいただき、有難うございます。
回答2件
あなたの回答
tips
プレビュー