スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Javascriptのお勉強

初めてJavascriptというものに挑戦してみた。

jsはクラスの考え方がC#と少し違う。
プロトタイプ・ベースのオブジェクト指向と呼ばれているそうだ。
最もシンプルなクラスの例は
var TestClass = function() {};
var test = new TestClass();//インスタンス化

関数オブジェクトにクラスとしての役割を与えているということのようだ。


C系のオブジェクト思考の人ならコンストラクタとプロパティのイメージは
var TestClass = function(a, b) {
this.a= a;
this.b= b;
}

これで分かると思う
this.プロパティ名 = 値
のように記述することで、オブジェクトにプロパティを追加することができる
またコンストラクタに戻り値は不要(C++とかとは違う)


次にメソッド。
var TestClass = function(a, b) {
this.a = a;
this.b = b;
this.toString = function() {
window.alert(this.a);
};
}

これも問題なさげ。

JavaScriptの特徴としてインスタンス化されたオブジェクトに対しても、後からメンバを追加できる
var test = new TestClass(20, 10);
test.toString = function() {
window.alert(this.a);
};

ただしオーバーライドされるようなことは無いので二重に登録すると普通にエラーになる


上記の方法だとインスタンスが大量にある場合、動的にメソッドを追加するとすべてのインスタンスに対して作業が行われてしまう
これは速度に問題があるしメモリ的にも無駄。そんなもののために用意されたのがプロトタイプ
test.prototype.toString = function() {
window.alert(this.a);
};

に変えるだけである。 

このときのメソッドを呼ばれたときの挙動は以下のようになる。
このインスタンスにその名前が見つからない!

prototypeを見に行こう!

見つけたので実行!

こうすることで無駄なコピーが行われないという仕組みになっているわけだ

また重要な性質として
・プロトタイプはメソッドに限らずプロパティも持つことができる
・プロトタイプと同じ名前のものを実装することで特定のインスタンスからプロトタイプを隠蔽することができる
(一度隠蔽したものを消してプロトタイプを参照させたいときにはdelete test.aというようにdeleteを使う)
・インスタンス生成後でもプロトタイプの内容は変更できる



継承について
jsでクラスを継承するときはプロトタイプに書き込めばいい
具体的には
var ClassB= function() {};
ClassB.prototype = new TestClass();
};

とすればClassBはTestClassを継承したことになる
プロトタイプのルールを考えれば分かるがメソッドなどを検索する順は
ClassB→ClassBのプロトタイプ→TestClass→TestClassのプロトタイプ
となり名前の隠蔽も可能である
動的にプロトタイプの内容を変更できるため混乱しやすいプログラムは避けたほうがよさそう。
特にインスタンスを生成後に継承元をかえると参照にいくプロトタイプは更新されないという問題で嵌る可能性がある。危険だぞ。



以上で終わりだけど表記で戸惑う可能性のあるものをまとめてみた。
というか、しっかりと戸惑った

追記!この部分の間違いについてコメントを頂いたのでコメントもしっかり参照すること!

配列リテラル
大括弧して["aaa", "bbb", "ccc"] のようにリストを大括弧して変数に格納すると配列になる
配列リテラルのフォーマットの文字列をevalすると配列になる
例)aもbも中身が同じ配列ができる
var a = ["aaa", "bbb", "ccc"];
b =eval(a);


オブジェクトリテラル
{"aaa":"111", "bbb":"222"}のように対リストを中括弧して変数に格納すると連想配列になる
オブジェクトリテラルのフォーマットの文字列をevalすると連想配列になる
例)aもbも中身が同じ連想配列ができる
var a = {"aaa":"111", "bbb":"222", "ccc":"333"};
b =eval("("+a+")");// 小括弧しているのは、オブジェクトリテラルとして認識させるため


JavaScriptではオブジェクトと連想配列との間に厳密な区別はない
ということは
obj.x

obj["x"]
と等価であるし

var obj = new Object();
obj.x = 1;
obj.y = 2;


var obj = {x:1, y:2};
は等価となる





恐らくC#の人はjsと仲良くなれる。
そんな気がする。おそらく。たぶん。

ねよっと。

スポンサーサイト
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。