どのように使用するかについては、違いはありません。ただし、パフォーマンスの観点からは、前者の方法が望ましいでしょう。あなたの例を少し拡張しましょう:
var prototypePony1 = new Pony();
var prototypePony2 = new Pony();
var thisPony1 = new Pony2();
var thisPony2 = new Pony2();
prototypePony1.hasOwnProperty('bite'); //returns false
prototypePony2.hasOwnProperty('bite'); //returns false
thisPony1.hasOwnProperty('bite'); //returns true
thisPony2.hasOwnProperty('bite'); //returns true
Pony.prototype.bite = function() { alert('Nomnomnom!'); };
Pony2.prototype.bite = function() { alert('Nomnomnom!'); };
prototypePony1.bite(); //alerts 'Nomnomnom!'
prototypePony2.bite(); //alerts 'Nomnomnom!'
thisPony1.bite(); //alerts 'Chomp!', instance property is accessed first
delete thisPony2.bite;
thisPony2.hasOwnProperty('bite'); //returns false
thisPony2.bite(); //alerts 'Nomnomnom!'
上記の例ではthisPony1
、thisPony2
両方とも関数の独自のコピーを取得します。これは、bite
関数が使用して定義されているためです。this
しかし、prototypePony1
両方ともfromのコンストラクターのprototypePony2
同じコピーを共有します。Pony2 でプロトタイプ
を定義すると、引き続きインスタンス プロパティが最初にアクセスされます。新しく定義されたプロトタイプ プロパティが に表示されるのは、インスタンス プロパティを削除するまではありません。
オブジェクト メソッドの定義の詳細については、こちらをご覧ください。bite
Pony
bite
thisPony1
thisPony2