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