В поддержку хорошего ответа Шона: нет ничего плохого в замене всего прототипа, если вы делаете это до , то вы создаете экземпляры объекта. Это также работает:
function A(name){
this.name = name;
}
A.prototype = {
talk: function(){
return "hello " + this.name;
}
}
a = new A("brad");
a.talk() // works
Только не забудьте заменить его позже (если только это не то, что вы пытаетесь сделать).
В вашем исходном примере A
не было вашего пользовательского прототипа во время создания вашего первого экземпляра, но он имел его при создании второго, потому что вы создали прототип между ними.
Цепочка прототипов создается при создании экземпляра объекта, поэтому, как вы продемонстрировали, два экземпляра одного и того же "класса" могут иметь разные прототипы.
Это может вызвать всевозможные проблемы:
var a = new A("brad");
console.log(a instanceof A) // true
A.prototype = {
talk: function(){
return "hello " + this.name;
}
}
console.log(a instanceof A) // false
Объект, на который ссылается a
, больше не считается экземпляром A
, поскольку instanceof
работает, проверяя, находится ли A.prototype
в цепочке прототипов a
.