「一気に最後まで読んだ」本、教えて下さい!

クラス内からインスタンス先の名前を参照する事は出来るのでしょうか

例えば
function hoge(){
 this.dispname=function{
  alert("xxxxx");
 }
}

 var fuga1=new hoge();
 var fuga2=new hoge();
とインスタンスして、
 fuga1.dispname();
 fuga2.dispname();
とした時
xxxxにそれぞれ'fuga1'、'fuga2'といった名前
を取得してセットすることは可能でしょうか?

逆なら、
 alert(fuga1.constructor.name); //Alerts "hoge"
 alert(fuga1.constructor.name); //Alerts "hoge"
と出来る。

※インスタンスする時に名前を渡すしかないんでしょうか。
 var fuga1=new hoge('fuga1');みたいに...

A 回答 (5件)

思いつきですみません、とりあえず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>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

これでいけそうですね。

お礼日時:2010/07/29 21:09

#3, 4 です。



#3 で書き忘れましたが、一般には prototype の方が高速だといわれています。
ちなみに、プロトタイプチェーンは Hoge.prototype を指定したから行われる処理というわけではなく、常に行われる処理です。
# プロパティ走査では直属のプロパティから確認するので、プロトタイプオブジェクトを意識することは少ないと思いますが、念のため。

11.2.1 プロパティアクセス演算子 - 11 式 (Expressions)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
8.7.1 GetValue (V) - 8 型 (Types)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
8.6.2.1 [[Get]] (P) - 8 型 (Types)
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …

>  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 …
これでできる! クロスブラウザJavaScript入門:第2回 完全版:ブラウザとデバッグ環境|gihyo.jp … 技術評論社
http://gihyo.jp/dev/serial/01/crossbrowser-javas …

attachEvent(), on****イベント属性への関数定義で、関数の中に関数を内包する形にすると発生しやすいリークパターンです。
非常に影響範囲が大きく、MSからは必要なくなったイベント属性は削除することが勧められています。

window.onunload = function () {
 element.onclick = null;// onclickイベントハンドラ属性は null を代入するとイベントハンドラを削除できる
}

関数を入れ子にしなければ条件が成立しないので、リークパターンを知っている人は「可能な限り、関数を入れ子にしない(クロージャを無駄に生産しない)方がよい」とよく指摘します。

また、DOMノードだけでなく、ActiveXObject でも発生するのでかなり厄介です。
http://vird2002.s8.xrea.com/test/XMLHttpRequest. …
    • good
    • 0
この回答へのお礼

think49さん、詳しく調べてくださってありがとうございました。

 OBJECT指向については、まだまだ理解出来てませんが、
いろんなのを作ったり見たりしていると、徐々にではありますが
解ってくるような気がします。

 prototype拡張についてはこの夏の課題として、じっくり試して
みるつもりです。

 明日から旅に出ます。またお会いするまでさようなら。

お礼日時:2010/07/30 18:38

#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');

このように、使い回すことが出来ます。

(...次の記事に続きます...)
    • good
    • 0

> 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>

この回答への補足

jQueryさんだと、どうやって実現しているのかとソースを
覗いて見たんですけど、No.1さんの回答に近い方法の
window[]の検索をやってるみたいでした。(間違ってるかも)
 window[ jsonp ] = window[ jsonp ] || function( tmp ) {
 ....

また、後処理で
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
なんてコードが入ってた、ほったらかしはよくないのかも..

補足日時:2010/07/30 09:37
    • good
    • 0
この回答へのお礼

ありがとうございます。
外から、引数でコールバック関数名を渡すのですね。
やはりその方法が賢明なのかも。

ところで、別質問になっちゃうかもかもしれませんが、
よくわからないのですが、

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);
 }
}

と同じと思ってよいのでしょうか?何か利点があるんでしょうか?

お礼日時:2010/07/30 09:13

こんばんは。



利用する場面がわからないので、変な回答かも知れませんが・・・、
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();

ぐらいしか思い付きません・・・。
まぁ、配列使ってる時点でインチキですが・・・。

この回答への補足

回答ありがとうございます。

利用する場面は、
fuga1にインスタンスしたhogeクラス内で、<script>を動的生成して、JSONPするんですが、
そのコールバック関数をクラス内に予め定義しておきたいのです。

JSONPリクエスト生成する時のパラメーターとして
<script src="......&callback=fuga1.dispname" type="text/javascript"....
のfuga1が取得したかったんです。

補足日時:2010/07/29 21:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!