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

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

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

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

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/04/08 00:32:17
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:edvakf No.1

回答回数27ベストアンサー獲得回数12

ポイント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

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

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

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

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

回答リクエストを送信したユーザーはいません