プロトタイプベースを確認

ごめん、プロトタイプベースってみんな知ってるもんだった?
あんまりそういう操作してなかったせいだと思うけど、結構最近までJavaScriptがそういう言語だというのも、そういう動作するっていうのも分からずに使ってたかも。3年くらいときどき仕事で使ってたのに。
まぁ、くよくよしてもしょうがない。


とりあえずそろそろきっちりJavaScriptを5ページまで読んでみたところでプロトタイプベースってのが不思議な感じ。ページを参考にオブジェクト定義後にすぐプロトタイプを作らないでやってみた。

//初めは哺乳類オブジェクトMammalがない。
>>> Mammal
Mammal is not defined

//Mammalを定義
>>> var Mammal = function() {};
>>> Mammal
function()
//Mammalをnewしてmを定義
>>> var m = new Mammal()

>>> m
Object
//↑なんかObjectだ
//↓もちろんundefinedじゃないよ
>>> undefined == m
false

//nameってプロパティはundifinedだ。
>>> undefined == m.name
true

//mにnameプロパティ追加してdogと命名!
>>> m.name = 'dog'
"dog"
//↑dogだ

//nameがundefinedじゃなくなった!
>>> undefined == m.name
false
>>> m.name
"dog"
//↑もちろんdog

//やっとMammalのプロトタイプを作ってみる。
//nameは'cat'で
>>> Mammal.prototype.name = 'cat'
"cat"

//でも、Mammalのオブジェクトなのにm.nameは'dog'のまま。
>>> m.name
"dog"

//m.nameを消しちゃえ
>>> delete m.name
true

//m.nameが'cat'になっちゃった
>>> m.name
"cat"

//何回消してもm.nameは'cat'
//プロトタイプのnameが'cat'になってるから
>>> delete m.name
true
>>> m.name
"cat"

//プロトタイプのnameを消したる!
>>> delete Mammal.prototype.name
true
//消えた。ほっ
>>> undefined == m.name
true

オブジェクトmからすると知らない間にプロパティのプロトタイプが作られたりするんですな。「プロパティをいくら消しても変な値が入ってるよー」ってことになっちゃうんすね。mが知らないうちにプロトタイプ作られちゃったから。m.nameを消しても'cat'が入ってるのが新鮮。
「だからプロトタイプなんだな!」って思った。

プロトタイプはJavaでのクラスの動的版ってイメージがしました。動きが面白いっすね。あと、プロパティを追加したり削除したり出来るあたりが「LLだな」って思いました。改めて。