◆ すでにインスタンスがあるときに prototype 置き換えても すでにあるものは変わりません

prototype を直接置き換えないほうがいいと前に記事書きましたが 今回は 途中で置き換えた場合です
Fn.prototypeを直接置き換えてはダメ

すでにインスタンスを作ったあとで prototype を置き換えると すでに作っていたインスタンスでは変更されません
そして すでにあったインスタンスを作った関数のインスタンスでなくなります
function A(){}
A.prototype.val = 1

var a = new A
console.log(a, a.val) // A {} 1

A.prototype = {
x: 100,
val: 200
}
console.log(a, a.val) // A {} 1

var a2 = new A
console.log(a2, a2.val) // A {} 200

console.log(a instanceof A) // false
console.log(a2 instanceof A) // true

置き換えずに編集すると
function A(){}
A.prototype.val = 1

var a = new A
console.log(a, a.val) // A {} 1

A.prototype.x = 100
A.prototype.val = 200
console.log(a, a.val) // A {} 200

var a2 = new A
console.log(a2, a2.val) // A {} 200

console.log(a instanceof A) // true
console.log(a2 instanceof A) // true

両方とも変更されています


prototype というのはインスタンスのオブジェクトが作られるときに そのオブジェクトの __proto__ というプロパティに参照として入っているものです
A.prototype を置き換えても a.__proto__ は変わらないです

分かりづらければ ただのオブジェクトに置き換えて見ればわかると思います
var a = {x:1}
var b = {}
b.a = a
a = {y:2}
console.log(b.a) // Object {x: 1}
a を変えても b.a が変わるはずないですよね

普通 定義したときにメソッドなどは作ってしまうものですし 途中で prototype 置き換えたり編集なんてないと思いますけど クラスベース言語と違って できてしまうのが JavaScript の良い所 (バグの元なので悪いともいえますけど)
使う場合は理解したうえで使いましょう

一番良いのは prototype は絶対置き換えない とすることだと思うんですけどね