【長いので】Sapporo.js-2010.10.03に行ってきた【オブジェクト編だけ】

前回に続き2回目の参加です。今回はJavaScript: The Good Parts(以下本)の3章と4章、オブジェクトと関数について。
Sapporo.js-2010.10.03 : ATND
JavaScriptについては知識も経験もゼロに等しい。つたないJavaRubyの知識で乗り切れるだろうか。

・値型と参照型がある。⇒これはJavaと同じ。
・値型にメソッドがある。⇒これはRubyぽい。じゃあ値型の特徴は?
・一度セットした値を変更することができない。⇒よく考えたら、これがよくわからない。変数が持っている参照が変わらないのは当然だとして、その参照が指す先が値型でも参照で、その参照の値を変えるには参照ごと書き換える必要があるってことか(この文章、明日読んだら絶対意味わかんなくなってる)。オブジェクトを値型に見せかけてるってイメージかな?

オブジェクトリテラル

これは、「JavaScriptのオブジェクトは、Hashだ。」と理解しました。記号からしてHash(Map、連想配列)だし、存在しないプロパティ名に(更新と同じ文法で)値を入れるだけでプロパティを追加できるとか、Hashそのもの。そこまで動的でいいのか・・。

プロパティ名

ダブルクォーテーションで囲えばハイフン等も使える(そのままだとマイナスに見えるため)。これはRubyのシンボルのようなイメージ。

値の取得

オブジェクト["プロパティ名"]

または

オブジェクト.プロパティ名

前者を使うのは、プロパティ名にハイフン等が入っているときくらいか。

オブジェクトは常に参照渡し

これはJavaRubyと同じかな、と思ったらディープコピーが不可能らしい。ふーん・・えっ

typeof演算子

typeof foo.bar

で、fooのbarプロパティが何なのかが文字列で返される。JavaRubyの「.class」と似ている。

プロトタイプ

JavaScriptの継承はプロトタイプを採用しています。内部的な仕組みはよくわからなかったのですが(ていうか、皆さんはここの議論が本日のメインディッシュだった感があるのですが、レベル高すぎなのでスルーしちゃいます・・)、
「プロトタイプに指定したオブジェクトへの参照を保持し、自分に無いプロパティが呼ばれたときにそちらを見に行く」という理解でどうよ。(あれ、これってJavaの継承も同じかな?)

よって、子オブジェクト生成後にプロトタイプが変更された場合、子オブジェクトも影響を受けます。

親の能力を受け継ぐ(クラスベースの継承)か、親にやってもらう(プロトタイプ)かって感じ。

プロパティの列挙

「for in」は順序無保証。んー、オブジェクトはHashだって考えるとわかる気がする。便利そうだけど、配列には使っちゃだめみたいです(本P70)。id:amachangさんのブログによると、

for in は配列の走査の目的では使ってはいけない。たとえば、以下のようにプロトタイプが拡張された場合に対応出来なくなってしまう。

Array.prototype.hoge = function() {};

for (var i in ['a', 'b', 'c']) {
  alert(i); // 1, 2, 3, hoge が表示される
}

for in はオブジェクトのプロパティを走査する記法だからだ。


JavaScript の配列と連想配列の違い - IT戦記

とのこと。今はよくわかりませんが、きっとわかります(?)

擬似名前空間

グローバル変数は、一つだけ(オブジェクトのを)作ってそこにいろいろ突っ込むこと。

3章おわり

とりあえずここまでがオブジェクト編(3章)。しかし、関数(4章)の方が意味不だったのです。次回につづく・・かな?


■参考
大活躍したFirefoxアドオン「Firebug
https://addons.mozilla.org/ja/firefox/addon/1843/