javascriptプロトタイプの修正と書き換え(上書き)の違い


JavaScript関数ごとにプロトタイプ属性があります.この属性はオブジェクトを引用しています.このオブジェクトはプロトタイプです.javascriptはこの原型の対象を修正することを許可します.修正には2つの方法があります.
方式1:元の原型オブジェクトに属性や方法を追加する
function Person()
{
}

Person.prototype.add = function(){
	alert(this.name);
};

Person.prototype.name = "aty";

var p1 = new Person();
p1.add();//aty
方式2:原型オブジェクトの書き換え(上書き)
function Person()
{
}

Person.prototype = {
	add : function(){
		alert(this.name);
	},
	name : "aty"
}



var p2 = new Person();
p2.add();//aty
上記の2つの方法が全部原型を修正できると見られますが、彼らの違いは一体何ですか?どのような方法がオススメですか?
function Person()
{
}

function Animal()
{

}

var person = new Person();
var animal = new Animal();

//     
Person.prototype.say = function(){
	alert("person");
}

//     
Animal.prototype = {
	say : function(){
		alert("person");
	}
}

person.say();//person
animal.say();//Uncaught TypeError: undefined is not a function 
まずオブジェクトを作成してから原型を修正すると、作成したオブジェクトが修正されたプロトタイプに正しくアクセスできます.作成したオブジェクトは、方式2を使用すると、修正されたプロトタイプにアクセスできません.この角度から見れば、方式1は方式2よりも明らかに良い.どうしてですか?
function Person()
{
}

function Animal()
{

}

var person = new Person();
var animal = new Animal();
alert(person.__proto__ === Person.prototype);//true
alert(animal.__proto__ === Animal.prototype);//true

//     
Person.prototype.say = function(){
	alert("person");
}

//     
Animal.prototype = {
	say : function(){
		alert("person");
	}
}

alert(person.__proto__ === Person.prototype);//true
alert(animal.__proto__ === Animal.prototype);//false
これはjavaの「修正引用」と「修正参照の対象」とよく似ています.効果も同じです.