2009/12/27
JavaScriptプログラマが理解しておくべき8つのこと。の個人的補足
もう今年はブログを書かないんだろうなーと思っていたけど、ちょっと気になるエントリを見てしまったので、書いておくよ!
ref - JavaScriptプログラマが理解しておくべき8つのこと - ++iskwn - キューイチ世代
いくか(8つ?)あるから、それぞれ勝手に全レスするよ!
(先に断りを入れておくと、僕は専門家でもなんでもないから、指摘があったら指摘してください)
たぶん、僕の書いた記事「javascriptを初めて学ぶ人についてのおさらい。その1」と「javascriptを初めて学ぶ人についてのおさらい。その2」を読めば全部理解するはず!(嘘偽有り)
JavaScriptは完全なオブジェクト指向ではない
これは書かれていることそのままでいいかな。ツッコミどころはそこじゃないけど。
ただ、一つ、「プロトタイプベース」「インスタンスベース」という言葉の指摘をするのであれば「オブジェクト指向プログラミング言語ではない」のが正しいのかな。どうでもいいけど
functionの定義には2つある。違いもある
これは完結してた
ただ、文と式、みたいなところにもスポットライト当ててください。。
いわゆるクロージャは単純な概念である
本文には
感覚的には単純だが、論理的には複雑で言葉で説明しづらい。体で覚えたほうが楽なタイプの概念。どんどん拾ったコードを試そう。試せばわかるよ。難しく解説してる人とか無視してOK。
これは本質を捉えている気もするけど、なんとなくアウト。
難しく解説するには、それなりの理由があるかも。特にスコープを理解しないと間違った用法が出回ると後々困るんじゃ。。?
javascriptの変数宣言には、letやvalみたいな宣言はなくて、varと宣言なしの
グローバル宣言しかない。特にこのグローバル宣言でクロージャを体得されると、後々余計なバグを作っちゃうかも
以下はグローバル宣言を使ったクロージャ的サンプル
var createCounter = function (){ counter = 0; return function (){ return counter++; }; }; var hoge = createCounter(); print(hoge()); // 0 print(hoge()); // 1 print(hoge()); // 2
これもクロージャだよね?と新人に聞かれたら、思わずスコープのお話をしてしまうに違いない!
なので、他のスコープから触れないように定義する。そうすると難しくなっていく。。。
var createCounter = function (){ var counter = 0; return function (){ return counter++; }; }; var hoge = createCounter(); print(hoge()); // 0 print(hoge()); // 1 print(hoge()); // 2
IE8はDOMアクセスがクソ速い
これは正しい。もちろん、Firefox3.5もOpera10も早い
でも、DOMをガリガリ書くよりも、CSSSelectorを使うようになっているトレンドも忘れないであげてください。。。
XmlHttpを使いたいだけならライブラリ使うな
そして再利用可能なコードなのに、似て非なるものが増えていく。。。
prototype継承とか言っちゃってる奴は目を覚ませ
元エントリによると
「prototypeを使ってプロパティの継承を行うメリットとは何か」
これに答えられないなら勉強しなおしたほうが良い。答えられた奴はprototype継承って言うのやめとこな?
そもそもprototypeは継承の仕組みではない。あと「プロトタイプベース」と「インスタンスベース」はまったく違う。
まず、ここまで書くならメリットを教えてあげてもいいじゃん。。。
「プロトタイプベース」「インスタンスベース」と上げる前に、prototypeのメリット的なのを僕から。
javascriptには、prototypeっていうプロパティがあって、そこに値を入れておくと、同じ値を共有(共有には御幣があるかも)できるよ。って仕組みがあります。まずはコード
var Hoge = function (){}; Hoge.prototype.hello = function (){ return 'hello world'; }; var a = new Hoge; print(a.hello()); // hello world
んで、このprototypeのおかげで、元となるprototypeに新しいプロパティを増やすと、そのprototypeのインスタンスにもそれがついてくるよ!ってのがメリットでしょうか(あまり使わないかも。。。)
var Hoge = function (){}; Hoge.prototype.hello = function (){ return 'hello world'; }; var a = new Hoge; print(a.hello()); // hello world Hoge.prototype.hello2 = function (){ return 'hello hello hello'; }; print(a.hello2()); // hello hello hello
インスタンスベース
説明が難しいところだけど、これはインスタンスベースでもできるじゃんか。ということなので、できる。上のコードをインスタンスベースにしてみると
var Hoge = { hello: function (){ return 'hello world'; } }; var a = Hoge; print(a.hello()); // hello world Hoge.hello2 = function (){ return 'hello hello hello'; }; print(a.hello2()); // hello hello hello
でもこれだと、インスタンス中の値がずっと同じ参照(※例1)になるから、javascriptでは、新しい参照を作るときに clone ではなく new という仕組みでクラスベースな考えになっている(※例2)。と
※例1
var Hoge = { counter: 0, increment: function (){ return this.counter++; } }; var a = Hoge; print(a.increment()); // 0 print(a.increment()); // 1 print(a.increment()); // 2 var b = Hoge; print(b.increment()); // 3
※例2
var Hoge = function (){ this.counter = 0; }; Hoge.prototype.increment = function (){ return this.counter++; }; var a = new Hoge; print(a.increment()); // 0 print(a.increment()); // 1 print(a.increment()); // 2 var b = new Hoge; print(b.increment()); // 0 print(b.increment()); // 1
うーん。あまりいい例が思い浮かばない。。。
とりあえず、javascriptにはconstructorもあるから、インスタンスベースではなく、クラスベースと捉えた方がわかりやすそう。
function.applyには正しい使い方がある
正しいかどうかは、別として、javascriptのthisという動的レシーバはとても便利だったりする。
var hello = function (arg1, arg2){ return this.calc(arg1, arg2); }; var Add = { calc: function (arg1, arg2){ return arg1 + arg2; } }; var Mul = { calc: function (arg1, arg2){ return arg1 * arg2; } }; print(hello.apply(Add, [1, 2])); // 3 print(hello.apply(Mul, [1, 2])); // 2
Javaで匿名クラスをゴリゴリとか、containerに入れてほげほげ。とか面倒なのが色々あるけど、javascriptなら標準装備!
なんて、うたい文句はあまりないけど、delegateとかproxyとかその辺がめっちゃ楽になるのはホント
(ってか「正しい使い方」を教えてください。。。)
Canvasは必ず覚えるべき
SVGもあると便利かと。
おわり
jsの話題で今年書くことになるとは思わなかった。。
とにかく、元エントリに何か物申すつもりはなく、補足も書いてあると良い事言ってるのになーと思ったんで個人的補足でした。
「インスタンスベース」でプロトタイプを学ぶなら、IoLanguageを触るのが一番簡単だと思う。きっとjsで、モヤモヤしていることはすべてスッキリ!になる。はず。
ちゃんとプロトタイプしたいならSelfもSlateも勉強になるはず。
「クラスベース」なプロトタイプはjavascriptじゃないかな。といっても、cloneとproto(__proto__はあるけど)がないと落ち着かない人はIoの世界へようこそ
Trackback
No Trackbacks
Track from Your Website
http://blog.xole.net/trackback/tb.php?id=736

Comment
No Comments