Kilka pytań dotyczących klas, metod i obiektów

2015-06-21 12:58
0
var foo = {
    name: 'Foo',
    age: '12',
    przedstaw_sie: function() {
        alert(this.name + " " + this.age);
    }
}

alert(foo.name);
foo.przedstaw_sie();

function Person(){
    this.name = 'Foo2';
    this.age  = '12';
    this.przedstaw_sie = function() {
        alert(this.name + " " + this.age);
    };
}

var foo2 = new Person();

Person.prototype.przedstaw_sie_zw = function() {
    alert(this.name + " " + this.age + " prototype");
}

alert(foo2.name);
foo2.przedstaw_sie();
foo2.przedstaw_sie_zw();

Witam. Jestem w trakcie nauki js i zastanawia mnie kilka rzeczy związanych z klasami, konstruktorami itp.

O ile dobrze rozumuję, to tworząc foo tworzę obiekt, z konkretnymi parametrami i to wszystko. Jest to zwykły obiekt. W drugim przypadku foo2 korzystam z konstruktora, więc mam możliwość stworzenia kilku obiektów, w odróżnieniu od foo. To oznacza, że funkcja (w tym wypadku Person) w js to tak jakby klasa zgadza się? W takim razie czym jest foo, co się dzieje w momencie takiego przypisania?

Dlaczego w foo trzeba skorzystać z :, a w function Person() z = ?

Czy powinienem traktować funkcję konstruktor tak jak klasy w innych językach i wrzucać tam również metody, czy skorzystać z prototype? Podobno prototype jest lepsze ze względu na zużycie pamięci.


„Every Pro was once an amateur, every expert was once a beginner.”
edytowany 3x, ostatnio: Fi3rce, 2015-06-21 13:01
Konkretne tagi, bez udziwnieñ. Porawiłem, ale next time będzie kosz. - olesio 2015-06-21 13:10

Pozostało 580 znaków

2015-06-21 13:21
3

foo to obiekt mapy,wiec masz do czynienia z parami klucz-wartosc.

Pozostało 580 znaków

2015-06-21 14:30
0

To w takim razie pozostały dwa głowne pytania:
1) Czy function Person() jest w cudzysłowie odpowiednikiem class Person z javy?
2) Czy lepiej jest zdefiniować metody w ciele funkcji Person, czy jak mamy np. 10 metod to na zasadzie Person.prototype.xxx() x 10?


„Every Pro was once an amateur, every expert was once a beginner.”
edytowany 3x, ostatnio: Fi3rce, 2015-06-21 14:33

Pozostało 580 znaków

2015-06-21 14:36
2015-06-21 14:59
2

W drugim przypadku foo2 korzystam z konstruktora, więc mam możliwość stworzenia kilku obiektów, w odróżnieniu od foo.

W pierwszym też możesz zrobić kilka obiektów jak chcesz, bo możesz "sklonować" obiekt:

var foo = {
    name: 'Foo',
    age: '12',
    przedstaw_sie: function() {
        alert(this.name + " " + this.age);
    }
}

var bar = Object.create(foo); // tworzymy obiekt na podstawie foo
var baz = Object.create(foo); // tworzymy inny obiekt na podstawie foo

To oznacza, że funkcja (w tym wypadku Person) w js to tak jakby klasa zgadza się?

Nie do końca. Funkcja to bardziej konstruktor. Czyli new Person() oznacza "utwórz obiekt w JavaScript, przypisz do niego to, co jest w zmiennej Person.prototype, a następnie, żeby zakończyć inicjalizację wywołaj funkcję Person(), która dołoży do niego (poprzez this) odpowiednie właściwości. (na dodatek funkcja Person() może zrobić psikusa i podmienić obiekt (zamiast this), ale tym na razie bym sie nie przejmował, żeby sobie nie namącić w głowie kompletnie))

jeśli coś miało być klasą to raczej coś w rodzaju (pseudokod):

klasa Person.prototype {
   funkcja przedstaw_sie_zw {
    alert(this.name + " " + this.age + " prototype");
   }
  konstruktor Person () {
    this.name = 'Foo2';
    this.age  = '12';
  }
}

Tyle, że to uproszczenie. Na codzień nie powinno się tak tłumaczyć, a raczej próbować się obyć z tym, ze JavaScript jest językiem hipsterskim i ma własne ironiczne reguły.

Czy powinienem traktować funkcję konstruktor tak jak klasy w innych językach i wrzucać tam również metody, czy skorzystać z prototype? Podobno prototype jest lepsze ze względu na zużycie pamięci.

myślę, że to kontrowersyjny temat. Jedni radzą tak, drudzy inaczej. Pisząc w konstruktorze możesz wykorzystać potęgę domknięć (closures), i zrobić np. zmienne prywatne czy inne jaja. Ale z drugiej strony tworzysz ileś razy to samo...

dodanie znacznika <code class="javascript"> - @furious programming


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);
edytowany 1x, ostatnio: furious programming, 2015-06-21 23:03

Pozostało 580 znaków

2015-06-21 21:29
0

W takim razie jeszcze ostatnie pytanie, czy kody poniżej są tożsame? Mam na myśli kwestię " Ale z drugiej strony tworzysz ileś razy to samo...". czy mimo to, że jest to prototype, to jest "tworzone kilka razy" tak jak by to było samo this.foo = function(){};

function Human(name, age, dateOfBirth, height) {
    this.name = name;
    this.age = age;
    this.dateOfBirth = dateOfBirth;
    this.height = height;
    Human.prototype.present = function() {
        return this.name + " lat " + this.age +
               " urodzony/a " + this.dateOfBirth +
               " wzrost " + this.height;
    };
    Human.prototype.changeHeight = function(new_height) {
        this.height = new_height;
    };
}
function Human(name, age, dateOfBirth, height) {
    this.name = name;
    this.age = age;
    this.dateOfBirth = dateOfBirth;
    this.height = height;
}

Human.prototype.present = function() {
        return this.name + " lat " + this.age +
               " urodzony/a " + this.dateOfBirth +
               " wzrost " + this.height;
    };
Human.prototype.changeHeight = function(new_height) {
        this.height = new_height;
    };

„Every Pro was once an amateur, every expert was once a beginner.”
edytowany 3x, ostatnio: Fi3rce, 2015-06-21 21:31

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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