obiekt i funkcja

GO
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 5 lat
0

Czesc,
Jak zrobić aby nie robic 2 roznych funkcji tylko dac jedna? Tyle ze problem stawia nazwa div'a, jednakze zmienna jest taka sama (to glownie od niej zalezy co sie pojawi).
Prosze o pomoc.

Kopiuj
function Auta(nazwa, model, moc) {
	this.nazwa= nazwa;
	this.model= model;
	this.moc= moc;
	
	this.modele= function() {
		if(this.model> 15) {
			return '***';
		}
		else if(this.model> 10) {
			return '**';
		}
		else {
			return '*';
		}
	};
	
	this.dod = function() {
		let extra2 = '<font color=yellow> extra2</font>';
		let extra1 = '<font color=yellow> extra1</font>';
		
		if(this.model> 15) {
			return this.nazwa+= extra2;
		}
		else if(this.model> 10) {
			return this.nazwa+= extra1;
		}
		else {
			return this.nazwa;
		}
	}
}

var audi= new Auta('Audi', 16, 9);

function audii() {
	document.getElementById('audidod').innerHTML = audi.dod();
	document.getElementById('audimodel').textContent = audi.model;
	document.getElementById('audimoc').textContent = audi.moc;
	document.getElementById('audimodele').textContent = audi.modele();
}


var bmw= new Auta('BMW', 13, 9);

function bmww() {
	document.getElementById('bmwdod').innerHTML = bmw.dod();
	document.getElementById('bmwmodel').textContent = bmw.model;
	document.getElementById('bmwmoc').textContent = bmw.moc;
	document.getElementById('bmwmodele').textContent = bmw.modele();
}

audii();
bmww();
Kopiuj
<div id="audi_">
	<h1><span id="audidod"></span></h1>
	Model <span id="audimodel"></span><br>
	Moc: <span id="audimoc"></span><br>
	Modele: <span id="audimodele"></span><br>
</div>


<div id="bmw_">
	<h1><span id="bmwdod"></span></h1>
	Model: <span id="bmwmodel"></span><br>
	Moc: <span id="bmwmoc"></span><br>
	Modele: <span id="bmwmodele"></span><br>
</div>
hurgadion
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:www
  • Postów:259
1

Hej,
tak na pierwszy rzut oka, dodaj metodę do objektu Auta, która będzie to robić co robisz dla Audi i dla BMW :)

SushiTrash
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 5 lat
  • Postów:41
2

Tak jak @hurgadion powiedział plus jeszcze bym Ci radzil zaznajomic sie z metoda .map(). Ta metoda umozliwi pozbycie sie tylu document.getElementById, przyklad: https://jsfiddle.net/h1zw4bc7/34/

edytowany 2x, ostatnio: SushiTrash
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:8423
1

Jak dla mnie to po prostu potrzebujesz dodać parametr do funkcji, a nawet dwa parametry:

  • auto do dodania
  • element DOM będący elementem-rodzicem do renderingu
    coś takiego:
Kopiuj

function renderAuto(auto, el) {
     el.querySelector('dod').innerHTML = auto.dod();
     el.querySelector('model').textContent = auto.model;
     el.querySelector('moc').textContent = auto.moc;
     el.querySelector('modele').textContent = auto.modele();
}

renderAuto(audi, document.getElementById('bmw'));
renderAuto(bmw, document.getElementById('audi'));

poza tym stylistyka leży. Dlaczego model jest zmienną, a modele jest funkcją? To mylące, potem sam nie będziesz wiedział, co jest zmienną a co funkcją. Powinno być to spójne. No i w ogóle po co ci konstruktor w tym przypadku i jakieś metody jeszcze? Funkcja Auta po prostu mogłaby już wszystko liczyć od razu i zwracać czysty obiekt z suchymi danymi (pod warunkiem, że obiekt nie będzie się zmieniał, będzie "niemutowalny")


edytowany 3x, ostatnio: LukeJL
siloam
Trafna uwaga. Funkcje powinny określać czynności.
LukeJL
swoją drogą jak teraz patrzę na te funkcje, to ja się zastanawiam czy w ogóle one powinny należeć do obiektu tworzonego przez Auta (bo jakby tak ładnie podzielić, to obiekt tworzony przez Auta zawierałby same dane, a te dane byłyby potem obrabiane przez "widok" (renderAuto). Jednak np. funkcja dod zwraca kod HTML (przestarzały swoją drogą, bo <font> już się nie używa), więc to raczej też bardziej odpowiedzialność widoku
LukeJL
w ogóle ja bym to po prostu zaorał i nie bawił się w jakieś konstruktory, a stworzyłbym normalnie obiekt przez literał obiektowy (np. {nazwa: "bmw"}, ewentualnie zrobił funkcję-fabrykę, która taki literał tworzy. Operowanie na konstruktorach, metodach, this itp. to w tym przypadku tylko zaciemnianie sytuacji i komplikowanie prostych rzeczy.
GO
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 5 lat
0
hurgadion napisał(a):

Hej,
tak na pierwszy rzut oka, dodaj metodę do objektu Auta, która będzie to robić co robisz dla Audi i dla BMW :)

Jak na razie jest tak:

Kopiuj
this.audii = function() {
		document.getElementById('audidod').innerHTML = audi.dod();
		document.getElementById('audimodel').textContent = audi.model;
		document.getElementById('audimoc').textContent = audi.moc;
		document.getElementById('audimodele').textContent = audi.modele();
	}
	
	this.bmww = function() {
		document.getElementById('bmwdod').innerHTML = bmw.dod();
		document.getElementById('bmwmodel').textContent = bmw.model;
		document.getElementById('bmwmoc').textContent = bmw.moc;
		document.getElementById('bmwmodele').textContent = bmw.modele();
	}

audi.audii();
bmw.bmww();
SushiTrash
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 5 lat
  • Postów:41
1
gohangbr napisał(a):
hurgadion napisał(a):

Hej,
tak na pierwszy rzut oka, dodaj metodę do objektu Auta, która będzie to robić co robisz dla Audi i dla BMW :)

Jak na razie jest tak:

Kopiuj
this.audii = function() {
		document.getElementById('audidod').innerHTML = audi.dod();
		document.getElementById('audimodel').textContent = audi.model;
		document.getElementById('audimoc').textContent = audi.moc;
		document.getElementById('audimodele').textContent = audi.modele();
	}
	
	this.bmww = function() {
		document.getElementById('bmwdod').innerHTML = bmw.dod();
		document.getElementById('bmwmodel').textContent = bmw.model;
		document.getElementById('bmwmoc').textContent = bmw.moc;
		document.getElementById('bmwmodele').textContent = bmw.modele();
	}

audi.audii();
bmw.bmww();

Nie, te metody robia dokladnie to samo co funkcje ktorych chciales sie pozbyc, chodzilo raczej o taka metode:

Kopiuj
this.injectData = function() {
    document.getElementById(`${this.nazwa}dod`).innerHTML = this.dod();
    document.getElementById(`${this.nazwa}model`)).textContent = this.model;
    document.getElementById(`${this.nazwa}moc`)).textContent = this.moc;
    document.getElementById(`${this.nazwa}modele`)).textContent = this.modele();
}

getElementById bedzie sie odnosic do nazwy samochodu tzn. this.nazwa = BMW to getElementById("BMWdod")

@Edit: za bardzo komplikujesz tymi konstruktorami. Duzo latwiej stworzyc jakas tablice z pojazdami:

Kopiuj
var cars = [
{
nazwa = "BMW",
model = "F31"
},
{
nazwa = "Audi",
model = "A4"
}
]

i napisac funkcje ktora wrzuci to do html. Zredukujesz kod o polowe

edytowany 2x, ostatnio: SushiTrash
GO
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 5 lat
0
Karol Szymanowski napisał(a):

this.injectData = function() {
document.getElementById(${this.constructor.nazwa}dod).innerHTML = this.dod();
document.getElementById(${this.nazwa}model).textContent = this.model;
document.getElementById(${this.nazwa}moc).textContent = this.moc;
document.getElementById(${this.nazwa}modele).textContent = this.modele();
}

getElementByIdbedzie sie odnosic do nazwy samochodu tzn.this.nazwa = BMWtogetElementById("BMWdod")

A po co jest nazwa constructor?
Reszty kodu nic nie ruszam, jedynie co to jeszcze wywoluje:
var audii = new Auta('Audi', 16, 9);
audii.injectData();

i nie działa :(

edytowany 2x, ostatnio: gohangbr
SushiTrash
SushiTrash
Racja, ${this.constructor.nazwa}dod powinno byc zastapione ${this.nazwa}dod, sprawdz czy id divow sie zgadzaja tzn powinny byc takie dla Audi: Audidod Audimodel Audimoc Audimodele
GO
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 5 lat
0
LukeJL napisał(a):

Jak dla mnie to po prostu potrzebujesz dodać parametr do funkcji, a nawet dwa parametry:

  • auto do dodania
  • element DOM będący elementem-rodzicem do renderingu
    coś takiego:
Kopiuj

function renderAuto(auto, el) {
     el.querySelector('dod').innerHTML = auto.dod();
     el.querySelector('model').textContent = auto.model;
     el.querySelector('moc').textContent = auto.moc;
     el.querySelector('modele').textContent = auto.modele();
}

renderAuto(audi, document.getElementById('bmw'));
renderAuto(bmw, document.getElementById('audi'));

poza tym stylistyka leży. Dlaczego model jest zmienną, a modele jest funkcją? To mylące, potem sam nie będziesz wiedział, co jest zmienną a co funkcją. Powinno być to spójne. No i w ogóle po co ci konstruktor w tym przypadku i jakieś metody jeszcze? Funkcja Auta po prostu mogłaby już wszystko liczyć od razu i zwracać czysty obiekt z suchymi danymi (pod warunkiem, że obiekt nie będzie się zmieniał, będzie "niemutowalny")

czyli:
dodaje do function Auta:

Kopiuj
this.renderAuto = function(auto, el) {
     el.querySelector('dod').innerHTML = auto.dod();
     el.querySelector('model').textContent = auto.model;
     el.querySelector('moc').textContent = auto.moc;
     el.querySelector('modele').textContent = auto.modele();
};

a potem wywoluje:

Kopiuj
var audii = new Auta('Audi', 16, 9);
var bmww = new Auta('BMW', 13, 9);

bmww.renderAuto(bmw, document.getElementById('bmw'));
audii.renderAuto(audi, document.getElementById('audi'));

oraz poprawiam kod na:

Kopiuj
<div id="audi">
	<h1><span id="dod"></span></h1>
	Model <span id="model"></span><br>
	Moc: <span id="moc"></span><br>
	Modele: <span id="modele"></span><br>
</div>

dobrze mysle?

Wiem wiem, trochę zamotałem. Chyba sobie strasznie utrudniam. Faktycznie stylistyka leży, będzie więcej kodu to się zamotam...
Dokończmy może to a potem ogarnę sobie w tablicy :)

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:8423
1

czyli:
dodaje do function Auta:

Kopiuj
this.renderAuto = function(auto, el) {
   el.querySelector('dod').innerHTML = auto.dod();
   el.querySelector('model').textContent = auto.model;
    el.querySelector('moc').textContent = auto.moc;
    el.querySelector('modele').textContent = auto.modele();
};

Po co dodajesz tę funkcję do obiektu tworzonego przez funkcję Auta? Po prostu możesz zrobić funkcję renderAuto:

Kopiuj
function renderAuto(auto, el) {
     el.querySelector('dod').innerHTML = auto.dod();
     el.querySelector('model').textContent = auto.model;
     el.querySelector('moc').textContent = auto.moc;
     el.querySelector('modele').textContent = auto.modele();
}

ew. mógłbyś faktycznie ją doczepić do obiektu tworzonego przez funkcję Auta, i wtedy już niepotrzebny byłby dodatkowy parametr, ponieważ this byłoby autem.

Kopiuj
this.renderAuto = function(el) {
    el.querySelector('dod').innerHTML = this.dod();
    el.querySelector('model').textContent = this.model;
    el.querySelector('moc').textContent = this.moc;
     el.querySelector('modele').textContent = this.modele();
 };

Ale to kwestia podejścia. Ja bym wolał zrobić jednak osobną funkcję (i nie doczepiać jej nigdzie), żeby nie mieszać w jednym obiekcie kodu odpowiedzialnego za dostarczanie danych z kodem odpowiedzialnym za wyświetlanie elementu na ekranie (ponieważ mógłbym chcieć np. użyć te same dane i wyświetlić je kilka razy, za każdym razem w różny sposób).


edytowany 1x, ostatnio: LukeJL
GO
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 5 lat
0

Dodaje funkcje na zewnatrz a potem wywoluje:

Kopiuj
var audi = new Auta('audi', 16, 9); renderAuto(audi, document.getElementById('audi')); 
Kopiuj
<div id="audi"> 
<h1><span id="dod"></span></h1>
 Model: <span id="model"></span><br> 
Moc: <span id="moc"></span><br> 
Modele: <span id="modele"></span><br> 
</div> 

cos zle robie ...

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:8423
1

Aha, tam się pomyliłem w poprzednim kodzie, więc jak weźmiesz to, co napisałem bez poprawek to nie zadziała.

Kopiuj
 el.querySelector('dod').innerHTML = auto.dod();

machnąłem się i napisałem dod, ale querySelector przyjmuje selektor podobny do tego w CSS, a nie id https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector

i żeby znaleźć obiekt o danym id należałoby zrobić .querySelector('#dod')
Tylko, że id musi być unikalne w danym dokumencie, więc lepiej byłoby operować na klasach:

Kopiuj
<span class="dod"></span>

a potem wyszukać to tak:

Kopiuj
 el.querySelector('.dod')

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.