Skrypt JS wywala error na ideone.com

0

Witajcie,

Pomyślałem troche potrenować się w JS bo chyba użyje go z V8 jako język skryptów więc zrobiłem sobie prosty kod.
http://ideone.com/fnqvlS
Nie wiem gdzie się wywala bo nie mam żadnego debuggera ani nic. Teraz pobieram Node.js i ogarnę sobie to może w IntelliJ. Klasa bez większego sensu tylko do testów. W JS jestem bardzo nowy. Proszę o pomoc. :)

1

Funkcje zadeklarowane wewnątrz konstruktora nie są widoczne z zewnątrz (to taki odpowiednik metody prywatnej). Jeśli chcesz by metoda była dostępna dla obiektu to masz dwie opcje:

1 - przypisanie metody do this:

function Acid() {
	// other stuff
	
	this.printAcid = function() {
		// code goes here
	}
}

2 - przypisanie metody do prototypu:

function Acid() {
	// other stuff
}

Acid.prototype.printAcid = function() {
	// code goes here
};

Drugi sposób lepszy bo nie kopiuje kodu funkcji dla każdego nowo utworzonego obiektu.

0

Niby działa, ale jednak wyświetla zamiast stringów null. Jak usunę przypisanie na początku Acid(){} to wyświetla undefined.

1

A co wg Ciebie ma wyświetlić jak nigdzie nie przypisujesz nic innego niż null??

0

@Maciej Cąderek, nie wiem czemu ale nie dzialalo tworzenie metod typu function namedAcid(...), dopiero jak zrobilem this.namedAcid = function(...) działa. Zmieniłem też wywołanie metod w switchu, teraz jest this.namedAcid(...). Program działa teraz Ok :D

1

this.hydrogen = name.substring(0, 1); this.rest = name.substring(2);
nie odpalałem, ale ten kod dziwnie wygląda.
po pierwsze mam wrażenie, że masz off-by-one error. Dla name równego "H2SO3" będziesz mieć hydrogen równe "H" (a nie "H2", dwójka nie będzie łapana, byś musiał dać 0, 2 w argumentach).
po drugie wygląda na to, że zakładasz na twardo, że akurat wodór będzie miał znaki. Co jeśli tak nie będzie?

2

Fakt, coś tam próbowałeś, ale robisz to w tak dziwaczny sposób, że nie zauważyłem. Poczytaj jak działa this -> http://bonsaiden.github.io/JavaScript-Garden/pl/#function.this

Nie używaj pseudotablicy arguments, to bardzo zła praktyka - nazywaj swoje argumenty:

function Acid(first, rest){
    var that = this;

    this.hydrogen = null;
    this.rest = null;

    if (first && rest) {
        specifedAcid(first, rest);
    } else if (first) {
        namedAcid(first);
    }
 
    function namedAcid(name){
        that.hydrogen = name.substring(0, 2);
        that.rest = name.substring(2);
    }
 
    function specifedAcid(hydrogen, rest){
        that.hydrogen = hydrogen;
        that.rest = rest;
    }
}
 
Acid.prototype.printAcid = function(){
    console.log("Hydrogen part: "  + this.hydrogen);
    console.log("Acid rest part: " + this.rest);
    console.log("Full acid name: " + this.hydrogen + this.rest);
};
 
var h2so4 = new Acid("H2", "SO4");
var h2so3 = new Acid("H2SO3");
 
h2so4.printAcid();
h2so3.printAcid();

Ogólnie pewnie trochę inaczej bym to zrobił, ale trzymając się Twojej koncepcji powinno to być właśnie coś takiego.

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