オプション 2 の結果、プロトタイプに暗黙的にバインドされている特定の関数が破棄されると想定するのは正しいですか?
はい、正確に。ただし、暗黙的にバインドされるプロパティはプロパティだけですが、constructor
ほとんど必要ありません。
機能の違いは何ですか?
オプション 1 は、既存のプロトタイプを拡張するだけです。プロトタイプ オブジェクトから継承するインスタンスが既に存在する場合は、それらのインスタンスもメソッドPerson
を使用できます。sayName
オプション 2 では、新しいプロトタイプは上書き後にインスタンス化されたオブジェクトにのみ使用されます。
どちらか一方を選択するメリットはありますか?
これらは今や自明のはずです。オプション 1 (拡張) はよりクリーンであると見なされ、外部/不明/ネイティブのプロトタイプを変更する場合は必須です。オプション 2 を避けるようにしてください。
それでもオブジェクト リテラル構文の方が気に入っている場合はObject.assign
、既存のプロトタイプを拡張するために使用することを検討してください。
Object.assign(Person.prototype, {
sayName: function(name) {
alert(name);
}
});
ES6 より前の環境では、ポリフィルObject.assign
が必要になる場合があります。または、$.extend
同様_.extend
に機能します。きっとお気に入りのライブラリにも、このためのヘルパー関数が付属しています。