• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クラス内からインスタンス先の名前を参照する事は出来るのでしょうか)

クラス内からインスタンス先の名前を参照する方法はあるのか?

このQ&Aのポイント
  • クラス内からインスタンス先の名前を参照することはできるのでしょうか?JavaScriptにおいて、インスタンスの名前を取得する方法について考えてみましょう。
  • 例えば、あるクラスの中でインスタンスの名前を取得してセットすることは可能でしょうか?インスタンス先の名前を参照する方法について、疑問点がある場合は以下の解説をご覧ください。
  • 逆に、インスタンスの名前を取得することができない場合は、他の方法を使用する必要があります。例えば、インスタンス化時に名前を渡すなどの方法が考えられます。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

思いつきですみません、とりあえずwindowを総なめするとか? <script> function hoge(){} hoge.prototype.dispname=function(){ for(var i in window){ if(window[i]==this){ alert(i); break; } } } var fuga1=new hoge(); var fuga2=new hoge(); fuga2.dispname(); fuga1.dispname(); </script>

yyr446
質問者

お礼

回答ありがとうございます。 これでいけそうですね。

その他の回答 (4)

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

#3, 4 です。 #3 で書き忘れましたが、一般には prototype の方が高速だといわれています。 ちなみに、プロトタイプチェーンは Hoge.prototype を指定したから行われる処理というわけではなく、常に行われる処理です。 # プロパティ走査では直属のプロパティから確認するので、プロトタイプオブジェクトを意識することは少ないと思いますが、念のため。 11.2.1 プロパティアクセス演算子 - 11 式 (Expressions) http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/11_Expressions.html#section-11.2.1 8.7.1 GetValue (V) - 8 型 (Types) http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/8_Types.html#section-8.7.1 8.6.2.1 [[Get]] (P) - 8 型 (Types) http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/8_Types.html#section-8.6.2.1 >  window[ jsonp ] = window[ jsonp ] || function( tmp ) { jquery-1.4.2.js における5015行目でしょうか。 line 5015: window[ jsonp ] = window[ jsonp ] || function( tmp ) { コールバック関数を定義しているっぽいですね。 「JSONPを実行後、削除する処理」のようですが、jQuery.ajax() では jsonpCallbackプロパティでコールバック関数名を明示的に渡しているようなので、window のプロパティ走査ではないと思います。 jQuery.ajax() ? jQuery API http://api.jquery.com/jQuery.ajax/ 無題メモランダム: jQueryでJSONP http://blog.mudaimemo.com/2008/09/jqueryjsonp.html > // Handle memory leak in IE > script.onload = script.onreadystatechange = null; IE6SP2- のメモリリークパターンですね。(IE6 SP3で修正済みです) Internet Explorer リーク パターンを理解して解決する http://msdn.microsoft.com/ja-jp/library/bb250448%28VS.85%29.aspx これでできる! クロスブラウザJavaScript入門:第2回 完全版:ブラウザとデバッグ環境|gihyo.jp … 技術評論社 http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0002?page=5 attachEvent(), on****イベント属性への関数定義で、関数の中に関数を内包する形にすると発生しやすいリークパターンです。 非常に影響範囲が大きく、MSからは必要なくなったイベント属性は削除することが勧められています。 window.onunload = function () {  element.onclick = null; // onclickイベントハンドラ属性は null を代入するとイベントハンドラを削除できる } 関数を入れ子にしなければ条件が成立しないので、リークパターンを知っている人は「可能な限り、関数を入れ子にしない(クロージャを無駄に生産しない)方がよい」とよく指摘します。 また、DOMノードだけでなく、ActiveXObject でも発生するのでかなり厄介です。 http://vird2002.s8.xrea.com/test/XMLHttpRequest.html

yyr446
質問者

お礼

think49さん、詳しく調べてくださってありがとうございました。  OBJECT指向については、まだまだ理解出来てませんが、 いろんなのを作ったり見たりしていると、徐々にではありますが 解ってくるような気がします。  prototype拡張についてはこの夏の課題として、じっくり試して みるつもりです。  明日から旅に出ます。またお会いするまでさようなら。

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

#3 です。 > と同じと思ってよいのでしょうか?何か利点があるんでしょうか? #3 の [お礼] に書かれたコードはコンストラクタ関数が実行される度に関数オブジェクトを生成しています。 function Hoge () { // コンストラクタ関数  this.create = function () { }; // コンストラクタ関数が実行される度に関数オブジェクトを生成する } var foo = new Hoge(); // コンストラクタ関数を実行する 対して、Hoge.prototype はコンストラクタ関数が実行される度に関数オブジェクトを生成しない特徴があります。 function Hoge () { // コンストラクタ関数  // コンストラクタ関数が実行されるときには何もしない } Hoge.prototype.create = function () {}; // 生成されたオブジェクトから参照される var foo = new Hoge(); // コンストラクタ関数を実行する foo.create(); // プロトタイプチェーン (foo直属のプロパティを参照し、なければプロトタイプオブジェクトのプロパティを参照する。以降、プロトタイプオブジェクトがなくなるまで参照を遡る。) #3 の [お礼] のように、いわゆるクロージャを使う方法はプライベート変数(ゲッタメソッドを使用しないと、外部からアクセスできない変数)を定義する時に有効ですが、今回のケースでは prototype を利用した方が効率的だと思います。 Hoge.prototype.init はコンストラクタ関数で生成したオブジェクトを使い回しできるように、です。 状況によりますが、生成したオブジェクトの状態を保持する必要がない場合、 var foo = new Hoge(document, 'foo1'); foo.init(document, 'foo2'); foo.init(document, 'foo3'); foo.init(document, 'foo4'); foo.init(document, 'foo5'); このように、使い回すことが出来ます。 (...次の記事に続きます...)

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

> fuga1にインスタンスしたhogeクラス内で、<script>を動的生成して、JSONPするんですが、 > そのコールバック関数をクラス内に予め定義しておきたいのです。 直接的な回答ではなく、代替案になりますが、こういう方法はどうでしょうか? <script type="text/javascript"><!-- (function () {  function Hoge () {   this.init.apply (this, arguments);  }  Hoge.prototype.init = function (doc, callbackname) {   var win = doc.defaultView || doc.parentWindow;   win[callbackname] = function () { alert('callbackfn: ' + callbackname); };   this.callbackname = callbackname;   this.create(doc);  }  Hoge.prototype.create = function (doc) {   var script = doc.createElement('script');   script.type = 'text/javascript';   script.src = './hoge.php?callback=' + this.callbackname;   doc.getElementsByTagName('head').item(0).appendChild(script);  }  var fuga = new Hoge(document, 'foo1');  fuga.init(document, 'foo2'); })(); foo1(); // callbackfn: foo1 foo2(); // callbackfn: foo2 //--></script>

yyr446
質問者

お礼

ありがとうございます。 外から、引数でコールバック関数名を渡すのですね。 やはりその方法が賢明なのかも。 ところで、別質問になっちゃうかもかもしれませんが、 よくわからないのですが、 function Hoge () {   this.init.apply (this, arguments);  } Hoge.prototype.init = function (doc, callbackname) {   var win = doc.defaultView || doc.parentWindow;   win[callbackname] = function () { alert('callbackfn: ' + callbackname); };   this.callbackname = callbackname;   this.create(doc);  } ------ としているのは、 function Hoge () {   this.init = function (doc, callbackname) {   var win = doc.defaultView || doc.parentWindow;   win[callbackname] = function () { alert('callbackfn: ' + callbackname); };   this.callbackname = callbackname;   this.create(doc);  }   this.create = function (doc) {   var script = doc.createElement('script');   script.type = 'text/javascript';   script.src = './hoge.php?callback=' + this.callbackname;   doc.getElementsByTagName('head').item(0).appendChild(script);  } } と同じと思ってよいのでしょうか?何か利点があるんでしょうか?

yyr446
質問者

補足

jQueryさんだと、どうやって実現しているのかとソースを 覗いて見たんですけど、No.1さんの回答に近い方法の window[]の検索をやってるみたいでした。(間違ってるかも)  window[ jsonp ] = window[ jsonp ] || function( tmp ) {  .... また、後処理で // Handle memory leak in IE script.onload = script.onreadystatechange = null; なんてコードが入ってた、ほったらかしはよくないのかも..

回答No.2

こんばんは。 利用する場面がわからないので、変な回答かも知れませんが・・・、 function hoge()  this.dispname = function() {   for (var varname in hugas) {    if (hugas[varname] == this) alert(varname);   }  } } var hugas = {}; hugas.fuga1 = new hoge(); hugas.fuga2 = new hoge(); hugas.fuga1.dispname(); hugas.fuga2.dispname(); ぐらいしか思い付きません・・・。 まぁ、配列使ってる時点でインチキですが・・・。

yyr446
質問者

補足

回答ありがとうございます。 利用する場面は、 fuga1にインスタンスしたhogeクラス内で、<script>を動的生成して、JSONPするんですが、 そのコールバック関数をクラス内に予め定義しておきたいのです。 JSONPリクエスト生成する時のパラメーターとして <script src="......&callback=fuga1.dispname" type="text/javascript".... のfuga1が取得したかったんです。

関連するQ&A