メソッドに自分自身を渡す方法について

このQ&Aのポイント
  • メソッドに自分自身を渡す方法について、ソースコードの例を紹介します。
  • クラスQuestionのメソッドcheckNumber()で、disp()を呼び出し、自分自身を引数として渡す方法について説明します。
  • この方法を使うことで、メソッド内で自身のインスタンスを操作することができます。
回答を見る
  • ベストアンサー

メソッドに自分自身を渡す場合

連続で質問して申し訳ありません。 メソッドに自分自身を渡す場合がどのように記述すればよいでしょうか。 ソースを以下のように書いていますがうまくいきません。 disp()というメソッドでは、Questionのインスタンスを受け取り処理を行います。 クラスQuestionのメソッドcheckNumber()で、disp()を呼び出し、自分自身を引数として渡しているつもりです。(引数に thisを入れています) Question.prototype.checkNumber = function(number) {  if (number == this.answer)  {   this.ansCount++;  } else {   this.missCount++;  }  disp(this); } 稚拙なプログラムで本当に申し訳ありません。 よろしければお知恵をお貸しください。

  • ryu-e
  • お礼率72% (202/278)

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

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.4

#3です。 蛇足ですが、a要素はdiv要素を括ることが出来ません。 a要素が内容に持てるのはインライン要素だけです。 この場合、a要素で括る必要は全くなくて、<div style=\"position: relative;\"> にclickイベントを定義すれば済むと思います。 ------- document.write("<a href=\"JavaScript:q.checkNumber(1)\">"); document.write("<IMG src=http://kuratakatsuhiko.appspot.com/img/frame.JPG width=50 height=50 name=\"img\" border=\"0\">"); document.write("<div style=\"top:20px; left:20px; position:absolute; z-index:2;\" id=\"Layer4\" align=\"center\">"); document.write("1"); document.write("</div>"); document.write("</a>"); ------- element.addEventListener - MDC https://developer.mozilla.org/ja/DOM/element.addEventListener > for()の行で「'undefined' は Null またはオブジェクトではありません。」というエラーが発生します。 getDispNum() を探ってみるといいかもしれません。

ryu-e
質問者

お礼

ありがとうございます。 試してみます。

その他の回答 (4)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.5

よくわからないけれど… function disp(q)のはじめのところで  alert(q);  alert(q.getDispNum()); みたいなのを実行してみれば? 想像するところ、前者はObjectかなんかを返すけれど、後者はundefinedなのではないだろうか?? これまた想像で、Question.getDispNum()が定義されていないとか、定義されていても返り値が設定されていない(=値はない null || undefined)とかあたりが怪しそう… 全体を見ても、No3様もご指摘のように、やりたいことが見えてこないのでどこが悪いとも言いにくい。

ryu-e
質問者

お礼

すみません。勉強しなおしてきます。

  • think49
  • ベストアンサー率59% (285/482)
回答No.3

#2の補足より引用。 > q.getDispNum()のqそのものがわからないのだと思います。 確かめてみたところ、q の値は正しく入っています。 Question(), getDispNum(), getNumber() は記載がなかったので、適当に書き加えました。 <script type="text/javascript"> (function(){ function Question(){ // 適当に書き加えました this.answer = 3; this.ansCount = 0; this.missCount = 0; this.test = '"Hello, World!"'; }; Question.prototype.checkNumber = function(number) // 質問文と同じ { if (number == this.answer) { this.ansCount++; } else { this.missCount++; } disp(this); } Question.prototype.getDispNum = function() // 適当に書き加えました { return 5; } Question.prototype.getNumber = function() // 同上 { return 3; } function disp(q) { // #2の補足と同じ document.write("<table>"); for (k = 0; k < q.getDispNum(); k++) { var n= q.getNumber(k); document.write("<div style=\"position: relative;\">"); document.write("<a href=\"JavaScript:q.checkNumber(1)\">"); document.write("<IMG src=http://kuratakatsuhiko.appspot.com/img/frame.JPG width=50 height=50 name=\"img\" border=\"0\">"); document.write("<div style=\"top:20px; left:20px; position:absolute; z-index:2;\" id=\"Layer4\" align=\"center\">"); document.write("1"); document.write("</div>"); document.write("</a>"); document.write("</div>"); } } var foo = new Question(); // コンストラクタ foo.checkNumber(1); // 実行 })(); </script> どこに問題があるのかわかりませんが、適当なコードを切り離して、問題を切り分けて考えてみる事をお勧めします。 別に質問された http://okwave.jp/qa/q5836614.html も何をしたいのか、どんなコードを書きたかったのか、がよくわかりません。 何か基本的なところで勘違いがあるような気もします。 プロトタイプ(prototype)によるJavaScriptのオブジェクト指向:CodeZine http://codezine.jp/article/detail/222

  • imq
  • ベストアンサー率72% (16/22)
回答No.2

ソースを見る限りはdispにthisは渡せる筈です。 dispのソースがないので分りませんが、disp側の処理がおかしくないですか? 想像ですが、引数ではなくthisキーワードでインスタンスにアクセスしようとしているとか。 ちなみにdispはメソッドではなく関数ですよね。

ryu-e
質問者

補足

すみません、dispは関数でした。 dispの内容を以下に記載します。 function disp(q) { document.write("<table>"); for (k = 0; k < q.getDispNum(); k++) { var n = q.getNumber(k); document.write("<div style=\"position: relative;\">"); document.write("<a href=\"JavaScript:q.checkNumber(1)\">"); document.write("<IMG src=http://kuratakatsuhiko.appspot.com/img/frame.JPG width=50 height=50 name=\"img\" border=\"0\">"); document.write("<div style=\"top:20px; left:20px; position:absolute; z-index:2;\" id=\"Layer4\" align=\"center\">"); document.write("1"); document.write("</div>"); document.write("</a>"); document.write("</div>"); } } for()の行で「'undefined' は Null またはオブジェクトではありません。」というエラーが発生します。 q.getDispNum()のqそのものがわからないのだと思います。 自分ではこれ以上わかりません。申し訳ありませんが、お知恵をお貸しください。

回答No.1

disp.call(this);//ではだめか?

ryu-e
質問者

補足

だめでした。引数がわたっていないようです。 disp内部で、document.writeで引数を表示させたところ、undefinedと表示されました。

関連するQ&A

  • リンクの表示文字を変えたい

    リンクの表示文字を変えようとしています。 document.link.textを使用して実現しようとしているのですが、エラーになってしまいます。 何か良い方法はありませんでしょうか。 参考までに、自分の作ったコードを記載します。 <![CDATA[ <script type="text/javascript"> function disp() {  var n = q.getNumber(0);  n.dispNumber(); } function Number(number) {  this.number = number; } Number.prototype.dispNumber = function(){  document.write("<div style=\"position: relative;\">"); d ocument.write("<a href=\"JavaScript:q.checkNumber(" + this.number + ")\">");  document.write("<IMG src=" + this.URL + " width=" + this.size + " height=" + this.size + " name=\"img\" border=\"0\">"); document.write("<div style=\"top:" + this.size / 2 + "px; left:" + this.size / 2 + "px; position:absolute; z-index:2;\" id=\"Layer4\" align=\"center\">");  document.write(this.number);  document.write("</div>");  document.write("</a>");  document.write("</div>"); } Number.prototype.setNumber = function(number){  this.number = number; } function Question() {  this.number = new Array(); } Question.prototype.checkNumber = function(number) {  alert(number + "がクリックされました。");  document.link.text = -100; } Question.prototype.createNumbers = function() {  this.number[0] = new Number(1); } Question.prototype.getNumber = function(i) {  return this.number[i]; } </script> <div id="hoge"> <script language="JavaScript"><!-- var q = new Question; q.createNumbers(); disp(); //--> </script> </div> ]]> よろしくお願いします。

  • メソッドの引数としてのthisの意味

    java初心者です。教えてください。 メソッドの引数としてのthisは何を表しているのですか? いろいろ調べてみてthisには以下の2つの使用法があることがわかりました。 1.インスタンス変数の名前とインスタンスメソッド内のローカル変数名がかぶったときに、メソッド内でインスタンス変数を表すときにthis.変数名とする。 2.あるクラスのコンストラクタ内で、同じクラスの別のコンストラクタを呼ぶときに使う。 しかし、引数としてのthisの意味がわかりません。 具体的には、addMouseListener(this);や、g.drawImage(img,10,10,this);のthisです。 後者の場合はオブジェクトgのインスタンスメソッドなので、thisはオブジェクトgへの参照を表しているのでしょうか?

    • ベストアンサー
    • Java
  • 引数の違うメソッド

    PHPで同名で引数の違うメソッドを作成したいのですが、可能でしょうか? <?php class Test { var $test_str = ""; function set($str){ $test_str = $str; //$this->$test_str = $str; // どちらでも良い? } function Test() { // 引数なし } function Test($str) { // 引数あり $this->set($str); } } $obj = new Test(); ?>

    • ベストアンサー
    • PHP
  • prototypeについて

    this,prototypeを使ったメソッドの定義について質問します。 ●thisを使う場合 function SomeObject(){ ・・・・・・・・ this.f = function(){ ・・・・・ } } ●prototypeを使う場合 function SomeObject(){ ・・・・・・・・ } SomeObject.prototype.f = function(){ ・・・・・・・・ } カスタムオブジェクトのメソッドをthisキーワードを使わず、prototypeで定義する利点はどのようなことでしょうか。thisキーワードとprototypeの使い分けが分からなくて質問しました。よろしくお願いします。

  • ビルドインクラスにメソッドを追加したい

    たとえばこんなふうに、既存のBuild-Inクラスに、独自のメソッドを追加したいのですが・・ Array.prototype.get1 = function () {   // とくに意味なしなメソッド   return this[1] ; } ネスケ・Mozilla系やOperaはこれでうまくいくのですが、 IEだけまったく動作しません。 IEで、既存のビルドインクラスにメソッドを追加する方法って、ありませんでしょうか?

  • コンストラクタすると同時にメソッドをオーバーロードするには?

    コンストラクタすると同時にメソッドをオーバーロードするには? リスナー関数でthisの参照先が変わってしまう問題に悩んでいます。 <!-- 方法(1) コンストラクタした後にメソッドを上書きする --> <p id="Test">test</p> <script type="text/javascript"><!-- function Hello (value){ this.value = value ? value : 'Hello, World!'; } Hello.prototype.start = function (event) { alert(this.value); } var world = new Hello(); var start = function (event) { world.start.call(world, event); }; // thisがworldを参照するようにstartメソッドを作り直す document.getElementById('Test').addEventListener('click', start, false); //--></script> 上記コードは期待通りの動作ですが、せっかくコンストラクタしたにも関わらず、メソッドを上書きしなくてはなりません。 コンストラクタした時点でstartメソッドが完成しているのが理想です。 (以下、全角空白は半角空白に置換してください) <!-- 方法(2) クロージャでメソッドを生成する --> <p id="Test">test</p> <script type="text/javascript"><!-- function Hello (value) {  function start (event) {   alert(this.value);  }  this.value = value ? value : 'Hello, World!';  this.start = (function(that){   return function (event) {    start.call(that, event);    that = null;   };  })(this); } var world = new Hello('Hello, World2!'); document.getElementById('Test').addEventListener('click', world.start, false); //--></script> こちらは完全に期待通りの動作を示しますが、prototype を使用していないのが少し気になります。 <!-- 方法(3) クロージャで prototype.start を上書きする --> <p id="Test">test</p> <script type="text/javascript"><!-- function Hello (value) {  this.value = value ? value : 'Hello, World!';  this.start = (function(that, start){   return function (event) {    start.call(that, event);    that = start = null;   };  })(this, this.start); } Hello.prototype.start = function start (event) {  alert(this.value); }; var world = new Hello('Hello, World2!'); document.getElementById('Test').addEventListener('click', world.start, false); //--></script> 結果としては期待通りのコードになったのですが、以下の点が気になっています。 ・方法(2)、方法(3) を比較すると、それぞれどのようなメリット、デメリットがあるのか。(prototypeが高速と聞いてからは (3) に傾いているのですが、よくわかっていません) ・コンストラクタ時に発動する特別なメソッド、プロパティが用意されているのか。 ・クロージャを使わずに解決できるのか。 ・全く別の方法(もっと良い実装)があるのか。 コードの書き方は千差万別だとは思いますが、主観で結構ですので、アドバイスいただければ幸いです。 # start() はサンプル故に短いコードですが、実際には比較的長いコードがある状態を想定しています。

  • クラスメンバ・メソッドは継承しない?

    クラスのインスタンスオブジェクトで不変なクラスメンバとメソッドを定義したいのですが、継承クラスでエラーが出ます。 -------------------------------------------------------------------ここから function baseClass() { this.instStr = "base class instance property"; } baseClass.prototype.prtMethod = function(){return this.instStr;}; baseClass.clsStr = "base class property"; baseClass.clsMethod = function(){return baseClass.clsStr;}; base_inst = new baseClass(); alert( "baseClass:\n" + "\tinstStr = " + base_inst.instStr + "\n" + "\tprtMethod = " + base_inst.prtMethod() + "\n" + "\tclsStr = " + baseClass.clsStr + "\n" + "\tclsMethod = " + baseClass.clsMethod() + "\n" ); function upperClass() { this.instStr = "upper class instance property"; } upperClass.prototype = new baseClass; upper_inst = new upperClass(); alert( "upperClass:\n" + "\tinstStr = " + upper_inst.instStr + "\n" + "\tprtMethod = " + upper_inst.prtMethod() + "\n" + "\tclsStr = " + upperClass.clsStr + "\n" + "\tclsMethod = " + upperClass.clsMethod() + "\n" ); /* Exception: upperClass.clsMethod is not a function @Scratchpad:30 */ -------------------------------------------------------------ここまで 実行は Firefox 付属のスクラッチパッドで行いました。 期待する結果は、upperClass.clsStr がベースクラスで設定した"base class property"、upperClass.clsMethod() がその文字列を返す関数となって欲しいのです。 そもそも、Javascript ではクラス定義内部と prototype で設定したメンバとメソッドしか継承できないのでしょうか? あるいは他の方法がある?

  • jqueryでクイズを作成

    jqueryでクイズを作っているのですが、下のプログラムのような問題を書く部分(問題1、問題2...)のところに改行などを用いた長い文章を書きたいのですがどのようにしたらよいでしょうか? // answers の先頭が正答になるようにして下さい。選択肢はシャッフルして表示されます。 var questions = [ {'question': '問題1', 'answers': ['富士山', '愛鷹山', '天保山', '八ヶ岳']}, {'question': '問題2', 'answers': ['バラ', 'チューリップ', 'タンポポ', '百合']}, {'question': '問題3', 'answers': ['あららぎ', 'せんじょうがはら', 'せんごく', 'かんばる']}, {'question': '問題4', 'answers': ['宇宙人', '異世界人', 'ドイツ人', '未来人']} ]; Array.prototype.shuffle = function() { var i = this.length; while(i){ var j = Math.floor(Math.random()*i); var t = this[--i]; this[i] = this[j]; this[j] = t; } return this; }; var answers = []; var current_question_number; $.each(questions, function (i, question) { question.true_answer = question.answers[0]; question.answers.shuffle(); }); $(function() { showQuestion(0); $('#answer_button').click(function () { var answer = -1; $.each($('#answers input'), function (i, value) { if ($(value).is(':checked')) { answer = i; return false; } }); if (answer == -1) { $('#warning').slideDown(); return false; } $('#warning').slideUp(); answers[current_question_number] = questions[current_question_number].answers[answer]; if (current_question_number < questions.length - 1) { showQuestion(current_question_number + 1); } else { showResult(); } }); }); function showQuestion(question_number) { current_question_number = question_number; var question = questions[question_number]; $('#question_number').text((question_number + 1) + "/" + questions.length); $('#question_body').text(question.question); $('#answers').empty(); $.each(question.answers, function (i, value) { $('#answers').append($('<li/>').append($('<input type="radio" name="answer" id="answer' + i + '"/>')).append($('<label for="answer' + i + '"/>').text(value))); }); } function showResult() { $('#question_view').hide(); $.each(questions, function (i, question) { var is_true = answers[i] === question.true_answer; $('#results').append($('<tr/>') .addClass(is_true ? 'true' : 'false') .append($('<th/>').text(i + 1)) .append($('<td/>').text(answers[i])) .append($('<td/>').text(question.true_answer)) .append($('<td/>').text(is_true ? '○' : '×')) ); }); $('#result_view').show(); }

  • クラス内で自分自身をインスタンス化

    javaで開発をしております。 あるソースコードに、クラス内のメソッドで自分自身をインスタンス化しているものを見ました。初めて見たのですが、どういった場合に使われるのでしょうか。 public class Sample { public Sample hoge() { Sample sa = new Sample(); //何らかの処理 return sa; } }

    • ベストアンサー
    • Java
  • アサーションでメソッドの引数をチェックする

    お世話になります。 SJC-P取得のための勉強をしている中で、 次の疑問点があります。 ------------------------------------------ アサーションの使い方として、 (1)publicメソッドの引数をアサーションでチェックする--->ふさわしくない使い方 (2)privateメソッドの引数をアサーションでチェックする--->正しい使い方 ------------------------------------------ 以下のような解釈かと(無理やり)考えました。 privateメソッドは、自分自身しか使わない?ため、 引数に変な値を渡すことは無い。 publicメソッドは、他の人も使う可能性があり、 引数に変な値を渡すことが十分有りうる。 有り得る/有り得ないで、アサーションの 使う/使わないを決める??? しかしいまいちピンときません。 わかりやすく教えていただけませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう