人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

jQueryオブジェクトからインスタンス変数を参照

以下のコードについて質問です。
変数mydivにはコンストラクタの戻り値のjQueryオブジェクトが格納されています。
こうすることによって、mydiv.jQueryメソッドと記述できるようにしました。
そして、この変数でインスタンス変数を参照したいのですが、うまくいきません。
以下の場合ですと、インスタンス変数はundefinedと表示されてしまいます。

インスタンス変数はどのようにして記述すればよいでしょうか?

環境
PC:imac
ブラウザ:Chrome

●質問者: 匿名質問者
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から
$(function() {
var mydiv = new Div(1, 2);//変数に戻り値のjQueryオブジェクトが入る
mydiv.appendTo('body'); //インスタンス.jQeryメソッドと記述できる

//mydivがjQueryオブジェクトのためインスタンス変数が参照できない
console.log(mydiv.x);//undefinedと表示
});

// クラス定義
function Div() {
return this.create();
this.x = x;
this.y = y;
}
Div.prototype = {
create: function() {
return $('<div></div>');
}
}

1 ● 匿名回答1号

return するとその後のコードは実行しないです。

$(function() {
var mydiv = new Div(1, 2);//変数に戻り値のjQueryオブジェクトが入る
mydiv.appendTo('body'); //インスタンス.jQeryメソッドと記述できる

//mydivがjQueryオブジェクトのためインスタンス変数が参照できない
console.log(mydiv.x);//undefinedと表示
});

// クラス定義
function Div() {
 alert('いやっほう');//実行される
return this.create();
 alert('いやっほう');//実行されない
this.x = x;
this.y = y;
}
Div.prototype = {
create: function() {
return $('<div></div>');
}
}


なのでこんな感じで書くといいでしょう。

$(function() {
var mydiv = new Div(1, 2);
mydiv.appendTo('body'); 

console.log(mydiv.x);// 1
});

// クラス定義
function Div(x, y) {
 var obj = this.create()
obj.x = x;
obj.y = y;
return obj;
}
Div.prototype = {
create: function() {
return $('<div></div>');
}
}

匿名回答2号さんのコメント
すみません、横から...。 このコードってうまくいくんでしょうか? どうも、 var obj = this.create() ↑この時点でjQueryオブジェクトになってしまい、 xとyを設定したとしても return obj; ↑の時点でjQueryオブジェクト自体を返しているので、 var mydiv = new Div(1, 2); ↑インスタンス化した際はthisは$("<DIV>")を指し、create()メソッドは存在しないことになるのでは?? ※<>は全角です。

匿名回答1号さんのコメント
>> create()メソッドは存在しないことになるのでは?? << そうですけど、それが何か? 元のコードにも含まれていないと思いますし、new で得られたオブジェクトにコンストラクタが含まれないことに何か問題ありますか?

匿名回答2号さんのコメント
実行されてみればわかります。 console.logには Object #<Div> has no method 'create'

匿名回答2号さんのコメント
http://jsfiddle.net/2Nt7d/

匿名回答1号さんのコメント
onloadで実行してますよ。ご確認のほどを。

匿名回答1号さんのコメント
まあ、そこまでおっしゃるなら、追加しておきますけれども。 >|| $(function() { var mydiv = new Div(1, 2); mydiv.appendTo('body'); console.log(mydiv.x);// 1 }); // クラス定義 function Div(x, y) { var obj = this.create() obj.x = x; obj.y = y; obj.create = this.create; return obj; } Div.prototype = { create: function() { return $('<div></div>'); } } ||< 正直、なにが引っ掛かってるのか分かりかねます。

匿名回答1号さんのコメント
2号、だんまりですか? 回答へのつっこみは大歓迎ですが、つっこみへのこちらの応答に返事をしないのはあまり感心しない態度ですね。 結局、なにが気に入らなかったのか、明確にならないままで残念です。このままでは、2号がいちゃもんをつけてるだけのように見えてしまいます。

匿名回答3号さんのコメント
OOらしからぬ変態仕様に混乱して返事が出来ないのか我に返って枕に顔を埋めているのでしょう。 javascript/perlの闇は常人に耐えられぬほど深いのです。察して上げましょう。 匿名質問者さん宛メッセージとしては、このような事をしているとダークサイドに落ちてしまうので、普通の関数を使うかプラグインにしてしまうことをおすすめします。

匿名回答1号さんのコメント
>> javascript/perlの闇は常人に耐えられぬほど深いのです << perlの闇に敗れたクチなのでよく分かりますw

匿名質問者さんのコメント
回答が大変遅れてしまい申し訳ありません。return文を始めに書いてしまったのはミスです。失礼しました。 > var obj = this.create() このようにすればコントラクタでjqueryオブジェクトが扱えるようになるのですね。thisについてもっと勉強しなくてはいけません。 大変参考になりました。ありがとうございます。

2 ● 匿名回答2号
ベストアンサー

色々とチグハグなことをされていますし、なぜjQueryを使ってわざわざそんな後ろ向きな処理を行う必要があるのかがわからないですが....。

*以下の行の時点で、xとyを設定することができない。受け取れない。
// クラス定義
function Div() { ...

=======

*以下の行の時点でコンストラクタを作る意味がない。なぜなら、この時点で、xとyも参照されずに、returnしてしまっているし、この実行時のインスタンス化の際にthisはjQueryのラップ集合(この場合

)を指すからである。
return this.create();


要素にデータを持たせたいというのであれば、以下が参考になると思います。
jQuery.data(elem, name, value) - jQuery 日本語リファレンス
http://semooh.jp/jquery/api/internals/jQuery.data/elem%2C+name%2C+value/


匿名回答2号さんのコメント
>> ラップ集合(この場合 >> )を指すからである。 ラップ集合(この場合$("<DIV>"))を指すからである。 <>は全角です。

匿名質問者さんのコメント
回答が大変遅れてしまい申し訳ありません。 このようなことを行ったのはjqueryオブジェクトにデータを持たせたかったからです。 jQuery.data()なんていうメソッドがあったのですね!これは便利です。既にやりたいことがメソッドで用意されていたなんて知りませんでした。 すごい助かりました。ありがとうございます。 それと「ラップ集合」についてまだ理解をしておりません。勉強いたします。細かな点まで記述ありがとうございます。今後の勉強課題が増えました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ