2007/04/17

私は如何にしてJavascriptのprototypeを身につけたか。

ポスト @ 0:29:34 , 修正 @ 2007/04/17 0:42:05 |     このエントリーを含むはてなブックマーク

javascriptのprototypeはなかなか理解してもらえないですねぇ。
ここ1年間でマジマジと実感しました。

特に、大規模開発をしているとこだと、いろんな知識が入り乱れていて(ホームページ時代からAjax本を読んだ人とか)が、javascriptが単なる関数型列挙な言語(語弊があるけど)という見方が大多数を占めているように見えます。
そんな中で "String.prototype.trim" みたいなコードを見せても、説明下手なのか中々上手く伝わらないですねぇ。

ということで(?)、僕がjavascriptのprototypeを身に着けるまでやったこと、とか。これも備忘

prototype.jsのソースコードを眺める

Array.mapとかEnumerable, Hashは勉強になりますねー。
ただ、prototype継承されすぎて、ちょっと多すぎなこともあります。

var hoge = someone();
for(var property in hoge){
    if(hoge.hasOwnProperty(property)){
    }
}

実際に作ってみる。

やっぱインタフェースみたいなものは欲しいよね。ってことで書いてみると理解が深まる気がする。

var MyObject = function (){};
MyObject.prototype = {
    message: null,
    hello: function (){
        return this.message;
    }
};

var Hoge = function (message){
    this.message = message;
};
Hoge.prototype = new MyObject;

var hoge = new Hoge('hello');
alert(hoge.hello());
alert(hoge instanceof MyObject);

プロトタイプ継承のcloneを眺めてた。

たかだかcloneなのに、非常に多くのことが詰まってる。これはjavascriptのprototypeを身に着けるなら必須だと思う。

Object.prototype.clone = function (){
    var lamda = function (){};
    lamda.prototype = this;
    return new lamda;
};

var Hoge = {
    hello: function (){
        return 'i am hoge';
    }
};
alert(Hoge.hello());

var Foo = Hoge.clone();
alert(Foo.hello());

Foo.hello = function (){
    return 'i am foo';
};

var Bar = Foo.clone();
alert(Bar.hello());

関数を非同期化するやつを眺める

あまり実用性が無いと思われがちですが、結構使えます。
prototype.jsのbindと同じように使うとなお便利かと。

Function.prototype.lazy = function (){
    var __method = this;
    var args = $A(arguments);
    var bind = args.shift();
    return setTimeout(function (){
        return __method.apply(bind, args);
    }, 0);
};

var Hoge = {
    hello: function (){
        return 'i am hello';
    }
};

var Foo = {
    hello: function (){
        return 'i am foo';
    }
};

var say = function (someone){
    alert(this.hello() + someone);
};

say.bind(Hoge)(' call 1');
say.lazy(Hoge, ' call 2');

say.lazy(Foo, ' call 1');
say.bind(Foo).lazy(Hoge, ' call 2');

LDRのjsを読み耽る

いやーあれは色々勉強になりますねぇ。
読むだけで十分理解が深まった気分になれました。
「コードは小説より面白い」のはあながち。ですね。

ioLaunguageを使う。

言わずもがな、ioはprototypeな言語で、すごくわかりやすくprototypeを身に着けることがでる(ioはまだ、勉強中だけど)。
だって、Object cloneで、ほら継承がすぐ終わっちゃうのが凄い。

Object hello := method(return self type)
Hoge := Object clone
Foo := Hoge clone;

Hoge hello println
Foo hello println

全然prototypeと関係ないけど、IE限定でcallee.callerを使ってみる

なぜか、prototypeした(された?)オブジェクトからcallee.callerを使っている内に理解が深まったようなそうでもないような。

var Hoge = function (message){
    var foo = arguments.callee.caller;
    var anony = foo.arguments.callee.caller;
    foo.message = message;
    anony.message = message;
};

var Foo = function (message){
    this.message = 'i am foo';
    new Hoge(message);
    alert(this.message);
};

var Bar = new function (){
    this.message = 'i am bar';
    new Foo('hello');
    alert(this.message);
};
alert(Foo.message);
alert(Bar.message);

私は如何にしてjavascriptのprototypeを身につけたか。
身に着ける。まではいってなくとも理解を深めると言った程度ですけど。


Trackback

No Trackbacks

Track from Your Website

http://blog.xole.net/trackback/tb.php?id=560

1 Comment

R

基本すら知らない私が、なんとなく意欲を持ちましたw
HTMLを扱えた時もうれしかったので、これも頑張ってみますっ!

From : 疾風 @ 2007-04-21 09:23:33 編集

Post Your Comment


*は入力必須です。E-Mailは公開されません。

1 + 2 =