人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javascriptのprototypeの理解について困っています。

prototypeでメソッドを定義するのは、コンストラクタにメソッドを記述するとメモリが食うことはわかるのですが、
コンストラクタに定義したプロパティとメソッドが、prototypeで重複して定義していなければ、prototypeに定義したプロパティメソッドをprototype参照を使わないで使用できますし(それでもオブジェクトのインスタンスからしか参照できないですが)
Rectangle.getArea()のように定義する機会はどうなのでしょうか?
混乱して困っています。

実際、Rectangle.getArea()のようなオブジェクトからの参照の使い方をしているのは、標準グローバルオブジェクトでは主に
各オブジェクトのprototypeや継承しているもの
StringオブジェクトのfromCharCode()
Numberオブジェクトの計算に使うもの
だと思っているのですが、

文章がおかしくなってすみません。


function Rectangle(w, h) {
this.width = w || 0, this.height = h || 0;
}

// 2つのメソッドの違い
Rectangle.getArea = function() { return this.width * this.height; };
Rectangle.prototype.getArea = function() { return this.width * this.height; };

// テスト
var r = new Rectangle(10, 10);

●質問者: pochi1234
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:JavaScript Number Prototype String すみません
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ko8820
●0ポイント

http://d.hatena.ne.jp/yupug/20070413/1176472206


2 ● ku__ra__ge
●100ポイント ベストアンサー

質問文が混乱しているので「どのような場合にprototypeにメソッドを定義するべきなのでしょうか?」という質問だと仮定して回答させていただきます。


仕組みはともかくとしてprototypeを使ったオブジェクト指向を利用する場合、以下の2点を認識しておけばいいと思います。

・オブジェクトに設定したメソッドは、そのオブジェクトからしか使えない。(newして作成したインスタンスからは使えない)

・オブジェクトのprototypeに設定したメソッドは、そのオブジェクトからnewして作成したインスタンスで使える。


質問にある例ですと、インスタンスのwidth*heightを求めることが目的の動作のようなのでRectangle.prototype.getAreaを設定すべきです。

(Rectangle.getAreaのメソッドは、インスタンスrから呼び出すことは出来ません)


以下に、オブジェクトに定義されたメソッドとprototypeに定義されたメソッドがどう違うのかのサンプルコードを示しますので参考にしてください。

function Obj() {}
Obj.fncStatic = function () { alert('Static'); };
Obj.prototype.fncInstance = function () { alert('Instance'); };

//オブジェクトから直接メソッドを呼ぶ
Obj.fncStatic();
//Obj.fncInstance(); // ※1エラー

//オブジェクトからインスタンスを作成し、
//インスタンスのメソッドを呼ぶ
var obj = new Obj();
//obj.fncStatic(); // ※2エラー
obj.fncInstance();

※1:「Obj.fncInstance」なんてものは定義されていないので、エラー。

※2:newは、新しいオブジェクトを作成して、そこから親オブジェクトのprototypeが見えるように設定します。

このとき、prototype以外は作成されたオブジェクトから見えるように設定されません。

よって……

→objはObj.fncStaticを見つけることに失敗します。

→objはObj.prototype.fncInstanceを見つけることには成功します。

◎質問者からの返答

回答ありがとうございます。

インスタンスとstaticなプロパティ、メソッドで悩んでいたようです。

メソッドについては理解できましたが、

プロパティをカプセル化できないのがプロトタイプベースの言語にとっては仕方がないのでしょうか。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ