Ответ 1
... Я предположил, что, возможно, прототип означал, что он разделяет один и тот же объект, а не просто создает новый объект каждый раз...
Это так. Там один объект-прототип, который разделяется между всеми экземплярами, созданными из конструктора.
... однако, это явно не так, поскольку и apple1, и apple2 имеют разные цвета, все еще (после запуска script).
Для определенных типов (например, number, boolean, null, undefined или string), когда вы изменяете свойство, которое существует в объекте прототипа через this.color
, например, оно создаст свойство color
в экземпляр. Прототип остается незатронутым, так что новые экземпляры будут иметь цвет по умолчанию, определенный в прототипе.
Если вы обновили элемент массива или объект, на который ссылалось свойство объекта-прототипа, это изменение будет видно из всех экземпляров.
... Почему последний код не рекомендуется?
Поскольку вы создаете новые идентичные функции с созданием каждого нового экземпляра вместо совместного использования одного экземпляра функций через объект-прототип.
Чтобы развернуть немного больше, я бы отметил, что когда ваша функция вызывается как конструктор с помощью ключевого слова new
, <конструктор this
в конструкторе - это новый экземпляр. Поэтому в экземпляр добавляется любое свойство, добавляемое в this
.
var Apple = function() {
// Here "this" is the object being constructed. As such, we're adding
// a property "rotten" to every instance created
this.rotten = false;
};
// adding a "color" property to the prototype object
Apple.prototype.color = "red";
// set the property "color" on the instance to the value of "new_color"
Apple.prototype.changeColor = function(new_color) {
this.color = new_color;
};
// first check to see if this instance has its own "color" property. If so,
// use it. If not, look at the prototype object to see if it exists.
Apple.prototype.getColor = function() {
alert('color: '+this.color);
};
// two new instances each have their own "rotten" property, and don't have a
// "color" property. Both share the prototype object, so if "color" is
// requested, it will come from there
var apple1 = new Apple();
var apple2 = new Apple();
// This will add an "color" property to the "apple2" instance
apple2.changeColor("green");
// Doesn't have a "color" property, so it looks to the prototype object
apple1.getColor();
// Has a "color" property, so it uses that instead of the "color" on the prototype
apple2.getColor();