コンストラクタを実行してインスタンスのプロパティが設定されますが、
prototypeプロパティにプロパティを設定するメリットは何なのしょうか?
通常、インスタンスのプロパティが優先されるので使用の必要性がないと思うのですが。
Rectangle.prototype = {
width: 10, // ここ
getArea:function { return this.width * this.height; }
}
下のように 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
こういうことをしたいなら、コンストラクター内で毎回宣言しないとだめです。
インスタンス生成時に、prototypeプロパティにプロパティを指定する機会は上記の例以外ではなさそうですね。