+ JavaScript の質問用スレッド vol.39 +
なんでクラスやらが出てくるんだか
一子相伝ですか?
SubClass.prototype = new SuperClass();
var oSub = new SubClass();
var oSub2 = new SubClass();
これだとSuperClassの変数が共有されて継承にはなってないよな
継承に関しては
>>1-50のどこかの関連スレに詳しく考察しているサイトがいるから
それをチェックしてみたらいいのではないでしょうか。
個人的な意見だけれど、JavaScriptのオブジェクトの考え方は今までの継承ベースではなく
クロージャーベースになっているので、継承に拘らず、上の階層で抽象化して
やり取りするように書けばかなりすっきり書けるのではないかと思います。
別にマルチじゃねーけどな。
function init() {
var a = new testClass('a');
var b = new testClass('b');
a.show();
b.show();
document.getElementsByTagName('body')[0].onmousedown = a.show;
document.getElementsByTagName('body')[0].onmouseup = b.show;
}
function testClass(v) {
this.v = v;
}
testClass.prototype.show = function() {
alert(this.v);
}
init() を<body> のonloadで実行すると…
質問1: 'a', 'b' は期待通りに表示してくれるけど、mousedown, up はundefined になるのは、何故?
質問2: これを、'a', 'b' と表示させるには、どうすれば良い?
>>944 だからprototypeを使う以上出来ないって。なんでそこまでこだわるの?
testClass.show = function() {...} という書き方にすれば
クロージャが使えるって上で散々言われてるじゃない。数レスくらい読もうよ。
他のOOPと同じ感覚で使うためのポイントを洗い出したら
JavaScriptって大したことねーなと思えてくるから不思議。
ECMAScript E4Jは神がかって使いやすいからブラウザ標準にしてほしい。
E4Xだった
testClass.prototype.show2 = function() {
var str = this.v;
return function () { alert(str); }
}
>>949 それ、prototypeを使う意味が全くない気がするんだけど。
何のためにprototypeで宣言しているのか意味がわからない。
それに、その実装だと a.show()() という形で呼ばないといけないし。
this.show = function(_this) { return function(){ alert(_this.v); }; }(this);
同じ事をやるなら、こちらの方がマシじゃない?
>>944 document.getElementsByTagName('body')[0].addEventListener("mousedown", function() {a.show();}, false);
>>944 上でも書かれているけれど、なぜprototypeを使いたいの?
prototypeさえ使わなければ何の問題もなく解決できる種類の問題なんだけど、
なにかprototypeを前提とした制約があるなら、それを細かく書けば
何らかの助言が得られると思うよ。
ここ最近のレスを見ていて、夏でも意外とこのスレのレベルが悪くないと思った
function kurouja (obj, methodName) {
return function() { obj[methodName](); }
}
せめてメソッドの参照をわたせたらカッコが付くのだが
return function() { eval(str); }
分けずに皆囲ってしまえば問題ないことに気づいた。
955 :
944:2005/08/11(木) 21:12:52 ID:???
function init() {
var a = new testClass('a');
a.show();
document.getElementsByTagName('body')[0].addEventListener("mousedown", function() {a.show2();}, false);
document.getElementsByTagName('body')[0].onmouseup = a.show3;
}
function testClass(v) {
this.v = v;
this.show3 = function(){alert('3'+this.v);};
}
testClass.prototype.show = function() {
alert('1'+this.v);
}
testClass.prototype.show2 = function() {
alert('2'+this.v);
}
レス下さった方どうも。
1a, 2a, 3undefined になりました。
改めて質問、何故?現象としてこうなる、じゃなくて原理としてこうなる、って講釈をお願い。
call とか、 apply とかでもどうにかできるのでしょうか?この辺りの理解が足りないもので…
>>951 それが、私が今必要としているコードの様です。
>>955 globalスコープ(コンテキスト)にはどのスコープからもアクセスできる。
thisは呼び出されたスコープを指す(ここが普通のOOPと根本的に違う)
957 :
944:2005/08/11(木) 21:38:53 ID:???
>>956 なるほど、と言う事は undefined の時の this は、DOM body エレメントを指してるって理解でよろしいですか?
onmouseup に設定しているものは、a.show3 への参照で、
例えばa.showを設定すれば、prototype のそれへの参照になるだけで、
この際に、prototypeを使用したからとかクロージャとかは
この問題の本質(undefined になる)とは関係ないという理解でよろしいですか?
958 :
944:2005/08/11(木) 21:52:18 ID:???
function init() {
var a = new testClass('a');
a.show();
document.getElementsByTagName('body')[0].onmousedown = a.show3;
document.getElementsByTagName('body')[0].onmouseup = a.show;
}
function testClass(v) {
this.id = v;
this.show3 = function(){alert('3'+this.id);};
}
testClass.prototype.show = function() {
alert('1'+this.id);
}
自分でやってみました。<body id="body"> としています。
1a, 3body, 1body という結果になりました。
理解できました。非常に為になりました。みなさんありがとうございました。
var hairetu = new Array(3);
function kansuu(){
hairetu[0] = ("menu.png");
hairetu[1] = ("メニューです"); }
で
<img alt='"+ hairetu[1] +"' //略
だとALTは表示されたんですが
var hairetu = new Array(3);
function kansuu(){
hairetu[0] = ("menu.png","メニューです"); }
<img alt='"+ hairetu[0][1] +"' //略
だと表示されませんでしたボスケテつД`)・゚・。・゚゚・*:.。
hairetu = ("menu.png","メニューです");
<img alt='"+ hairetu[1] +"' //略
kansuuってなに?いらねーでしょ?
963 :
959:2005/08/12(金) 01:01:48 ID:???
はい、Web初心者質問スレで質問したんですが
「すれ違いだろ」と言われましてJava質問スレに移住した所存でございますorz
ボルジョアさんの回答の文法がとても参考になり959の上部の表示方法はできたんですが
下部の表示はできなかったので質問しますた
>>963 ぼるじょあのスクリプトを例にすると
var a = new Array();
で
一次元配列(縦)ができるでしょ?
作った配列それぞれを配列にすると
a[0] = new Array("img001.png", "ここは画像1番です");
二次元配列(縦・横)になるわけです。
--
hairetu[0] = ("menu.png","メニューです");
ってやっても二次元配列にはならないです。
hairetu[0] = ["menu.png","メニューです"];
ってかけ
resource[0] = [url:"menu.png, alt:"メニューです"];
968 :
ひとみ:2005/08/12(金) 01:33:22 ID:pPVmo79B
868さんありがとうございます。
いろいろ調べて、以下のようなJSを書いてみました。
bunki.html
/////
<head>
<SCRIPT LANGUAGE="JavaScript">
<!--
var today = new Date();
var to_month = today.getMonth();
var to_date = today.getDate();
var to_year = today.getFullYear();
if(to_year == 2005 && to_month+1 >= 8 && to_month+1 <= 9 && to_date >= 1 && to_date <= 31){
self.location.href = "a.html";
}
else if(to_year == 2005 && to_month+1 >= 10 && to_month+1 <= 12 && to_date >= 1 && to_date <= 31){
self.location.href = "b.html";
}
else{
self.location.href = "c.html";
}
//-->
</SCRIPT>
</head>
PC上では、うまく分岐はしてくれたのですが、環境が携帯なのです。
携帯環境ではJavaScriptは、対応していないのでしょうか?
よろしくご教授お願いします。
携帯でやるばあいだと
普通そういうのはCGIのお仕事・・・
>>968 自分だったら
2005/08/01のタイムスタンプ
2005/11/30のタイムスタンプ
:
を作っておいてタイムスタンプのまま比較するけどね
どのみち携帯向けだと
端末が JS を利用できることが期待できないので
サーバ側で振り分けるしかないと思うよ
972 :
959:2005/08/12(金) 03:07:23 ID:???
確かにkansuu不要でしたね
960さんのもダメだった・・orz
undefineって表示されます
hairetu[0] = ("menu.png");
hairetu[1] = ("メニューです");
で
<img alt='"+ hairetu[1] +"' //略
↑これなら表示されます
hairetu = ("menu.png","メニューです");
で
<img alt='"+ hairetu[1] +"' //略
↑これ無理でした
この差はなんでしょうか・・
973 :
959:2005/08/12(金) 03:11:50 ID:???
うわ、更新押してないで作業してたヨ;´Д`)
返答ありがとうございます
勉強になります
>>968 うむ、JSじゃ携帯無理。
CGI や PHP にアクセスさせるか、
どうしても HTML にアクセスさせたいなら、
その 12/1 に最初にアクセスした人がそのHTMLを書き換えてしまうような CGI・PHP を作って、
こっそり <IMG> しこませといてその都度アクセスしてやるのもいいかも知れない。
SSI でもいいし。
あとは cron を使うとか。
まあとりあえず JS はスレ違いっすね。
975 :
959:2005/08/12(金) 03:19:26 ID:???
キタ─wwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜─ョ !!
965さんのでばっちり出ました
ありがと〜
976 :
959:2005/08/12(金) 03:42:37 ID:???
964さんのも合ってました!
2度目のnew Arrayは横配列を作る意味があったんですね・・
スゲー勉強になりましたm_ _)m
hoge = {url:"img.gif", alt:"イメージだって"};
alert(hoge.url);
alert(hoge.alt);
JSONは[]じゃなくて{}という罠
978 :
959:2005/08/12(金) 08:06:20 ID:???
↓また表示できずorz今度違う箇所です
var hairetu = new Array(1);
hairetu[0] = new Array("menu1.png","menu2.png","メニューです");
<a onclick="showa1(a1)">
<img src=hairetu[0][0] alt=hairetu[0][2] onmouseover=this.src=hairetu[0][1] //略
srcとaltが表示できませんでした
onmouseoverはちゃんと表示します
src='"+ hairetu[2][7] +"' これも src='+ hairetu[2][7] +' これもだめでした
すみません、質問させて下さいませ
演算で正しい結果が得られなくて困っています
s2=(document.f1.k.value * 10 + document.f1.k2.value) * document.f1.b.value;
kとk2は一行フォームから入れさせる変数で、
bは指定の倍率です。
例:(10*10+1)*0.8=800.8000000000001
になってしまいます……
変数を使って
var 2k2 = 0;
2k2 = document.f1.k.value * 16;
s2=(2k2 + document.f1.k2.value) * document.f1.b.value;
としてもやっぱりうまく行きません
別の、括弧を使わない簡単な乗算は出来ているので、
式の作り方に問題があるのだと思うのですが
2重括弧を使うわけでもなさそうだし一体何を勘違いしているのやら;
もうここずっと唸りっぱなしです、助言お願いしますorz
誤 2k2 = document.f1.k.value * 16;
正 2k2 = document.f1.k.value * 10;
です
>>3 >>574 >>584 >>587 適当な位で四捨五入が簡単な解決方法だと思う
function myround(x){ return Math.round(x*1000)/1000; }
オマイラテンプレの議論は960越えてからじゃねぇ?
誰も口出さないってことは、このままで宜しい?
と、問題提起しとくんで、
あとはいつもの人次スレうp頼む。
というか、お休み中ですか?
人大杉なの?
誰も何とも言わないし、980越えてたんで立てといたぞいっと。