クラス内からインスタンス先の名前を参照する事は出来るのでしょうか
例えば
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');みたいに...
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>
No.5
- 回答日時:
#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. …
think49さん、詳しく調べてくださってありがとうございました。
OBJECT指向については、まだまだ理解出来てませんが、
いろんなのを作ったり見たりしていると、徐々にではありますが
解ってくるような気がします。
prototype拡張についてはこの夏の課題として、じっくり試して
みるつもりです。
明日から旅に出ます。またお会いするまでさようなら。
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');
このように、使い回すことが出来ます。
(...次の記事に続きます...)
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>
この回答への補足
jQueryさんだと、どうやって実現しているのかとソースを
覗いて見たんですけど、No.1さんの回答に近い方法の
window[]の検索をやってるみたいでした。(間違ってるかも)
window[ jsonp ] = window[ jsonp ] || function( tmp ) {
....
また、後処理で
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
なんてコードが入ってた、ほったらかしはよくないのかも..
ありがとうございます。
外から、引数でコールバック関数名を渡すのですね。
やはりその方法が賢明なのかも。
ところで、別質問になっちゃうかもかもしれませんが、
よくわからないのですが、
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);
}
}
と同じと思ってよいのでしょうか?何か利点があるんでしょうか?
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();
ぐらいしか思い付きません・・・。
まぁ、配列使ってる時点でインチキですが・・・。
この回答への補足
回答ありがとうございます。
利用する場面は、
fuga1にインスタンスしたhogeクラス内で、<script>を動的生成して、JSONPするんですが、
そのコールバック関数をクラス内に予め定義しておきたいのです。
JSONPリクエスト生成する時のパラメーターとして
<script src="......&callback=fuga1.dispname" type="text/javascript"....
のfuga1が取得したかったんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
static constメンバ変数(配列)...
-
Excel VBA の ChangeFileAccess
-
javascriptで文字挿入でtoggle...
-
C# .NET DataGridView の行を追...
-
Linux バイナリ実行できない "...
-
Array.prototype.~の使い方に...
-
hogehogeの由来
-
JavaScript を使ってpkゲームを...
-
同じIDで定義した要素の配列を...
-
C#OpenCv V4にのエラーに関する...
-
<a>タグのテキストを取得
-
functionから別のfunctionを実...
-
ActiveXobjectが作成できない
-
ジェネレーターの作り方
-
ASP.NET MVCでObjectをjsに渡す
-
window.openでタイトル名の指定
-
undefinedを表示させない方法は...
-
jspからjavascriptの変数引継ぎ
-
翌月を取得するGASが分かりません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
Vb.netのグローバル変数の宣言...
-
【正規表現】【javascript】CR...
-
ボタンをクリックすると数が増...
-
「オブジェクトが必要です。」...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
Excel VBA の ChangeFileAccess
-
【Jquery】changeイベント毎にa...
-
HTTPSのとき":"が"%3A"ではなく...
-
MFCのキャプション変更
-
C言語でクロージャを記述する
-
javascriptで文字挿入でtoggle...
-
同じ型【ハイフンと数字】だけ...
-
VB.NETで変数の型は自作...
-
サブウインドウから親ウインド...
-
親の親の・・・を抽出するSQL文
-
関数を呼び出すHTMLタグ<body o...
-
onclick指定関数の引数へローカ...
-
VB6における事前バインディング...
おすすめ情報