Po pierwsze - to co tworzysz jako peopleProto
to nie prototyp - to funkcja-konstruktor, która posiada właściwość prototype
, wiec powinieneś ją adekwatnie nazwać, powinna mieć nazwę rodzaju obiektu jaki chcesz za jej pomoca tworzyć, pisana z dużej litery, w Twoim przypadku np. Person
.
Nie to nie jest dobry pomysł, w prototypach powinny być tylko rzeczy których nie zamierzasz modyfikować (ani ustawiać w konsruktorze), a właściwości takimi polami nie są.
Jeśli spróbujesz zrobić to taki sposób:
var Person = function() {};
Person.prototype.name = 'no name';
var me = new Person();
var you = new Person();
to dostanieniesz jedną z dwóch rzeczy:
1."modyfikacja" własciwości bezpośrednio:
me.name = 'Maciek';
you.name = 'Zulik';
// wynik:
console.log(me.name) // => "Maciek" - ok
console.log(you.name) // => "Zulik" - ok
console.log(me.__proto__.name) // => "no name" - oops!
console.log(you.__proto__.name) // => "no name" - oops!
W tym wypadku właściwości zostana dodane do instancji, nie zostana zmodyfikowane w prototypie (wspólnym!), działa prawidłowo, ale mamy nadmiarowe,bezużyteczne .__proto__.name
(czyli efekt całkowicie odwrotny od zamierzonego oszczędzania pamięci)
2."modyfikacja" własciwości w prototypie:
me.__proto__.name = 'Maciek';
you.__proto__.name = 'Zulik';
// wynik:
console.log(you.name) // => "Zulik" - ok
console.log(me.name) // => "Zulik" - oops!
W tym wypadku właściwości nie zostaje znaleziona bezposrednio w instancji, wiec interpreter szuka dalej w prototypie, a że prototyp jest wspólny, to każda jego modyfikacja dotyczy wszystkich instancji.
Podsumowując - do deklarowania właściwości uzywaj funkcji-konstruktora, do deklarowania metod (publicznych) uzywaj prototype
(bo one moga być współdzielone).
PS
Wydajność i pamięć to rzeczy, o które w tym przypadku najmniej powinieneś sie martwić, chyba, że robisz BARDZO specyficzne rzeczy, wymagające inicjalizacji tysięcy, czy nawet dziesiątek tysiecy obiektów. Mozesz nawet w ogóle nie uzywać prototypów, a Twój kod zyska na prostocie i czytelności, np dzieki funkcjom fabrykom:
function createPerson() {
return {
name: 'no name',
printName: function() {},
// and more...
};
}
const me = createPerson();
const you = createPerson();
PPS
O takich rzeczach jak prywatność właściwości nie piszę, choć tego ewidentnie w podanych przykładach brakuje, ale nie tego dotyczyło pytanie.
PPPS
Przerzuć sie na ES6 bo mamy już końcówkę 2016 więc najwyższy czas.