JavaScriptのオブジェクト指向:プロトタイプをきちんと理解する
今回は、「オブジェクトのプロトタイプ」についてお話ししたいと思います。
はじめに
JavaScriptをより深く知りたい人のための当連載、今回が10回目です。
前回から、JavaScriptでオブジェクト指向を行うために必要な知識を解説しています。今回はその続きとして、「オブジェクトのプロトタイプ」というものについてお話ししたいと思います。
前回のおさらい
前回、JavaScriptで「クラス」を作るもっとも単純な方法として、以下のような方法をお見せしました。
function Person(name) {
// this演算子を用いて、メンバを追加
this.name = name;
this.hello = function() {
// this演算子を用いてメンバを参照
alert("こんにちは。私の名前は" + this.name + "です。");
};
}
thisキーワードを使って、オブジェクトに変数やメソッドを追加しています。前回の記事の最後では、「この方法には問題がある」と示唆しました。
その問題とは何でしょうか?
ここで、このPersonコンストラクタを何度も呼び出して、オブジェクトを複数個作るという処理を考えてみましょう。
var shiraishi = new Person("白石");
var nakajima = new Person("中島");
var okumura = new Person("奥村");
もちろん、これら全てのオブジェクトはhello()メソッドを持ち、それぞれに対して呼び出すこともできます。
shiraishi.hello(); nakajima.hello(); okumura.hello();
何の問題もないようですが、ここには一つ大きな落とし穴があります。それは、「まったく同じコードであるhello()メソッドが、オブジェクトごとに生成される」と言うことです。
図で表すと以下のようになります。
なぜこうなるのかは、コンストラクタ内の処理を見ていただければすぐにわかるでしょう。Personコンストラクタが呼び出されると、毎回関数オブジェクトを生成し、helloと言う名前でオブジェクト自身(this)に代入しているからです。
同じ処理を行う関数オブジェクトが、オブジェクトの数と同じだけ生成されることになるので、単純に言ってメモリの無駄遣いとなります。オブジェクトの数が増えるにつれて、これは到底容認できないコストとなります。
Javaを初めとしたオブジェクト指向言語では、各オブジェクトには元になる「クラス」があり、メソッドの定義はクラスに対して行われます。つまり、オブジェクトが複数あっても、メソッドの定義は一つです。そのため、ここで問題となっているようなメモリの無駄遣いが発生しません。
JavaScriptで、こうした問題を避けるためにはどうしたらよいのでしょうか?
- 特集: JavaScriptのイロハ (17件)
- 今日のトップ記事
- 2日前
- 4日前
- 6日前
- 7日前
- ホワイトペーパー
- 読者投票
- 話題のタグ
MS、Vistaとの互換性をチェックできる「Compatibility Center」リリースへ
「似非」SOAを見破る10の方法
Firefox 3のアドオンやテーマ管理を容易にする
openSUSE 11.0を試してみた
フォトレポート:世界各国の優秀な技術者がパリに集結--Imagine Cup 2008世界大会
バッチ処理でデータベース活用:4つの課題と5つの解決ポイント
Rubyでどう書く?:RubyでWord文書を作成する
今知るべき仮想化情報
「未来の、その先」をどう提言していくか
ZDNet Japan Green IT
DELL連載第4回〜「Microsoft System Center」
Techno Exchange