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

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.

3

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

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?
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

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;
	};

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