Prototypy obiektu, oszczędzanie Pamięci

0

hej
chciałbym zapytać o różnicę w zapisu (być może oszczędza to pamięć, ale nie wiem:

var peopleProto = function () {
};

peopleProto.prototype.age = 0;
peopleProto.prototype.name = "no name";
peopleProto.prototype.state = "no state";
peopleProto.prototype.printName = function() {...};

czy powyższy zapis jest jakoś lepszy od poniższego ? Czy własności umieszcza się w prototypie?, (np. by oszczędzić pamięć, jeśli nie to dlaczego?)
ja zawsze robiłem to w ten sposób:

var peopleProto = function(name, age, state) {
   this.name = name;
   this.age = age;
   this.state = state;
};

peopleProto.prototype.printName = function() {...};
0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1