Javascriptでprototypeプロパティについて質問です。

コンストラクタを実行してインスタンスのプロパティが設定されますが、

prototypeプロパティにプロパティを設定するメリットは何なのしょうか?

通常、インスタンスのプロパティが優先されるので使用の必要性がないと思うのですが。

Rectangle.prototype = {
width: 10, // ここ
getArea:function { return this.width * this.height; }
}

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/04/02 06:22:05
  • 終了:2010/04/08 00:32:17

ベストアンサー

id:edvakf No.1

edvakf回答回数27ベストアンサー獲得回数122010/04/02 09:51:08

ポイント60pt

下のように height と width を宣言するのでは、height のような宣言の仕方のほうが良いのではないかという質問ですか?

var Rectangle = function(){
  this.height = 10;
};
Rectangle.prototype = {
  width: 10,
  getArea: function(){return this.width * this.height;}
};
var rect = new Rectangle;
alert(rect.getArea());

この場合はどちらの宣言の仕方でも結果としては同じです。rect.width++ とやっても Rectangle.prototype.width が変更されるわけではないですし。

Google の出している JavaScript 最適化の記事には、できる限り width のような宣言の仕方をしたほうが、new する度に初期化のためのコードが走らないので良いとあります。

http://code.google.com/speed/articles/optimizing-javascript.html (Initializing instance variables の項)

width ぐらいだったらたいしたことないですが、getArea とかの関数だったら、何度も同じものを作るのは避けたいですね。


ただし、配列や連想配列を prototype で宣言する場合は、それが変更されないように注意しないといけません。

var Rectangle = function(){ };
Rectangle.prototype = {
  size: {width: 10, height: 10},
  getArea: function(){return this.size.width * this.size.height;}
};
var rect = new Rectangle;
rect.size.width = 20;
alert(Rectangle.prototype.size.width); // => 20

こういうことをしたいなら、コンストラクター内で毎回宣言しないとだめです。

id:pochi1234

インスタンス生成時に、prototypeプロパティにプロパティを指定する機会は上記の例以外ではなさそうですね。

2010/04/05 21:57:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません