• ベストアンサー

外部ファイルの参照の仕方

現在、外部ファイルに記述されたプログラムを参照するコードを書いているのですが、うまく実行できません。以下のコードなのですが、書き方が間違っているようでしたら、教えてください。 プログラムの内容としては、キューへの操作で、pushは値を格納、popは最小値を取り出す、peak最小値を参照する、という機能を提供しています。 (外部ファイル:PriorityQueue.js) function PriorityQueue(){ var queue=[]; var queue2=[]; } PriorityQueue.prototype.push = function (value){ queue.push(value); queue.sort(); queue.sort(function(queue,queue2) { return queue-queue2; }); } PriorityQueue.prototype.pop = function(){ var pop=queue.shift(); return pop; } PriorityQueue.prototype.peak =function(){ var peak= queue.shift(); queue.push(peak); queue.sort(); queue.sort(function(queue,queue2) { return queue-queue2; }); return peak; } } 参照元ファイル: <html><head> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <script src="PriorityQueue.js"></script> <script> var q = new PriorityQueue(); function doPush() { var val = document.driver.push.value; q.push(val); var log = document.getElementById("log"); log.innerHTML += "push(" + val + ")\n<br/>"; } function doPop() { var val = q.pop(); var log = document.getElementById("log"); log.innerHTML += "pop() -&gt; " + val + "\n<br/>"; } function doPeek() { var val = q.peek(); var log = document.getElementById("log"); log.innerHTML += "peek() -&gt; " + val + "\n<br/>"; } </script> </head><body> <form name="driver"> <input type="text" name="push"> <input type="button" value="Push" onclick="doPush();"> <br/> <td><input type="button" value="Pop" onclick="doPop();"> <br/> <td><input type="button" value="Peek" onclick="doPeek();"> </form> <span id="log"></span> </body></html>

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.2

・ 以下のコードを参考にしてみてください。 ------------------------------------------------------------ PriorityQueue.js ------------------------------------------------------------ function PriorityQueue() { this.queue = []; this.queue2 = []; } PriorityQueue.prototype.push = function (value) { this.queue.push(value); this.queue.sort(); }; PriorityQueue.prototype.pop = function () { var pop = this.queue.shift(); return pop; }; PriorityQueue.prototype.peak = function () { this.queue.sort(function (a, b) { return a - b; }); var peak = this.queue.shift(); return peak; }; ------------------------------------------------------------ ・ 次の2行を付け加えました。 document.driver.push.value = ""; document.driver.push.focus(); ・ 名前をpeakに統一しました。 ------------------------------------------------------------ <script> var q = new PriorityQueue(); function doPush() { var val = document.driver.push.value; q.push(val); var log = document.getElementById("log"); log.innerHTML += "push(" + val + ")\n<br/>"; document.driver.push.value = ""; document.driver.push.focus(); } function doPop() { var val = q.pop(); var log = document.getElementById("log"); log.innerHTML += "pop() -&gt; " + val + "\n<br/>"; } function doPeak() { var val = q.peak(); var log = document.getElementById("log"); log.innerHTML += "peek() -&gt; " + val + "\n<br/>"; } </script>

ny_cs
質問者

お礼

サンプルコードまでご提示いただきありがとうございました。 いただいたコメントを参考にプログラムを修正したところ、おができました無事に実行することができました!感激です。 本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

ざっとしか見てないけど、多分queueとqueue2を解決できないから。 解決方法は2通りあって、prototypeプロパティにこだわるなら queueとqueue2を外部から参照できるようにしなくてはならない。 すなわち、 function PriorityQueue(){ this.queue=[]; this.queue2=[]; } PriorityQueue.prototype.push = function (value){ this.queue.push(value); this.queue.sort(); this.queue.sort(function(queue,queue2) { return queue-queue2; }); } - - - 以下略 - - - もうひとつはprototypeプロパティを利用して後から追加しているメソッドを 始めからファンクションの中に閉じて定義しておく方法。 すなわち function PriorityQueue(){ var queue=[]; var queue2=[]; this.push = function (value){ queue.push(value); queue.sort(); queue.sort(function(queue,queue2) { return queue-queue2; }); } } - - - 以下略 - - - 前者と後者には若干違いがあって 前者はqueueとqueue2変数をfunctionの(パブリックな)フィールドとしているために 外部からアクセスできてしまう。 つまり、上記html内部において、「q.queue」とするとqueue変数を参照することができる。 後者はqueue、queue2ともに通常の変数であるため、ファンクション内において 参照が可能であり、外部から参照されることが無い。 オブジェクト指向的に言えば、フィールドを自由に触れることはあんまりよろしくないそうなので 個人的には後者の利用を推奨する。 余談だが、pushメソッドの後半に書かれている「queue.sort(function~」は この記述では引数のファンクションは実行されていないので 無意味に見えます。 無名関数を実行するには最後に()が必要です。

ny_cs
質問者

お礼

コメントありがとうございました。テキストを参考にしながら、つぎはぎでプログラムを書いているのですが、やっぱり本質的な内容を理解していないと間違いになかなか気づけないものですね。 いただいた内容を踏まえて修正したところ、うまく動きました。 ありがとうございました。

すると、全ての回答が全文表示されます。