Prototypy obiektu

0

Cześć
Chciałbym wyrobić sobie dobry nawyk jako, że jestem początkującym.
Czy
gdy stworzyłem funkcję w prototypie obiektu

 mójObiekt.prototype = {
   nazwaFunkcji: function(){}
}

To czy ta funkcja moze operować na nazwach właściwości tego obiektu ? czy też od uzależnia się jednak body każdej funkcji?
"Każdej funkcji" - jest dla mnie logicznym, że gdy piszę się funkcję nie będącą prototypem to nie uzależnia się jej od jakichkolwiek nazw, natomiast jak to wygląda właśnie w przypadku powyżej (prototypu)

Napisałem coś takiego i się zastanawiam czy to jest duży błąd:

Module.prototype = {
check: function () {
  for (var i = 1 ; i <= this.kind ; i++) {
    var ratio = (this.price * 1e3 / this["weight_"+i]).roundUp(2)
    try {
      if (isNaN(this["weight_"+i])) throw {type: "error", status: 1};
      if (isNaN(this["unitPrice_"+i])) throw {type: "add: " + ratio.toFixed(2) + " zł", status: 3};
      this["result_"+i] = ratio.toFixed(2) == this["unitPrice_"+i] ? "OK" : ratio.toFixed(2) + " zł"
      this.status += 10;
   } catch(err) {
        this["result_"+i] = err.type;
        this.status += err.status;
     }
  }
}
0

To czy ta funkcja moze operować na nazwach właściwości tego obiektu ?

Oczywiście, że tak, inaczej obiekty byłoby bezużyteczne jako takie, zostałyby zredukowane do zwykłej mapy.

PS
O szczegółach kodu wewnątrz metody się nie wypowiadam, bo tam bieda, ale chyba nie tego dotyczyło pytanie.

0

chodziło mi właśnie o środek
czy nie poprawniej byłoby:

check: function (weight, unitPrice) {}

i w środku funkcji zamiast właściwości obiektu - typu "this.weight_1" używać "weight" i "unitPrice", które przekazuje jako parametry.

Coś w stylu

Module.prototype = {
check: function (weight, unitPrice) {
  for (var i = 1 ; i <= this.kind ; i++) {
    var ratio = (this.price * 1e3 / weight.roundUp(2)
    try {
      if (isNaN(this.weight)) throw {type: "error", status: 1};
      if (isNaN(this.unitPrice)) throw {type: "add: " + ratio.toFixed(2) + " zł", status: 3};
      this["result_"+i] = ratio.toFixed(2) == this.unitPrice ? "OK" : ratio.toFixed(2) + " zł"
      this.status += 10;
   } catch(err) {
        this["result_"+i] = err.type;
        this.status += err.status;
     }
  }
}
0

No jak dostarczasz dodatkowe dane do metody (potrzebne tylko tej metodzie) to przekaż je argumenty. Własciwości obiektu słuzą do przechowywania stanu obiektu, czyli rzeczy współdzielonych przez metody / charakterystycznych dla obiektu.

1

gdy piszę się funkcję nie będącą prototypem

Prototypem czy konstruktorem? Co prawda funkcja mogłaby być prototypem, ale myślę, że chodziło ci raczej o konstruktor:

// konstruktor
function Cat(name) {
   this.name = name; // ustawiasz zmienną name dla utworzonej instancji obiektu (tj. this to jest ta instancja wlasnie, obiekt, który utworzyłeś )
}

// prototyp
Cat.prototype.speak = function () {
   alert("I am " + this.name);  // odwołujesz się do zmiennej name utworzonej instancji obiektu
}

var catObj = new Cat('oscar');

// i teraz:
console.log(catObj.name) ; // oscar
catObj.speak(); // wyswietli alert "I am oscar"

catObj.name = 'oliver';
catObj.speak(); // wyswietli alert "I am oliver"

console.log(catObj.prototype); //  nic nie wyświetli, bo prototype to własciwosc konstruktora, a nie utworzonego juz obiektu
console.log(catObj.__proto__);  // wyswietli prototyp (specjalna wlasciwość __proto__ )
console.log(Object.getPrototypeOf(catObj));  // rowniez wyswietli prototyp 


poza tym można korzystać z prototypów bez konstruktorów np.:

var Cat = {
   speak: function() {
     alert("I am " + this.name);
   }
};

var catObj = Object.create(Cat); // tworzy nowy obiekt `catObj` na podstawie pewnego innego obiektu `Cat` (ktory to obiekt staje sie prototypem)
catObj.name = 'oscar';
catObj.speak();
console.log(Object.getPrototypeOf(catObj)); // wyswietla nam obiekt Cat

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