Jak stworzyc konstruktor z defaultowa wartoscia zmiennych?

0

Wiem, ze mozemy zebrac argumenty w obiekt i przekazac go do konstruktora i pozniej przypisac wszystko na zasadzie this.name = properties.name dzieki czemu nie musimy przejmowac sie kolejnoscia argumentow, ale co jezeli dana wartosc nie zostanie podana? Na stackoverflow znalazlem cos takiego:

function foo(a, b) {
    if (b===undefined) // parameter was omitted in call
        b= 'some default value';

    if (typeof(a)==='string')
        this._constructInSomeWay(a, b);
    else if (a instanceof MyType)
        this._constructInSomeOtherWay(a, b);
}

To jest bardziej sposob do wywolania roznych konstruktorow (cos jak w Javie?), ale bardziej chodzi mi o 2 pierwsze linijki. Czy nie lepiej zrobic np. tak:

function Coffee(properties) {
	this.roast = properties.roast === undefined ? 'default' : roast;
}

Pytanie bonusowe: Co oznacza _ lub & ? W roznych miejscach pisza rozne rzeczy, nawet spotkalem sie z twierdzeniem ze & ludzie daja przed zmiennymi przechowujacymi rzeczy pobrane za pomoca jQuery.

0

a nie mozesz jako parametr przyjac obiektu? Wywolywalbys cos w stylu:
foo({ "name" :"xyz", "foo": "bar"});

3

@krwq:
Przecież on o tym pisał właśnie (mozemy zebrac argumenty w obiekt), tylko chce mieć domyślną wartość, gdyby któraś właściwość obiektu nie została podana.

Fi3rce: w takim przypadku fajne jest jQuery'owe $.extend

function test(passed_options) {
  var defaults = {
    a: 'default',
    b: 'default'
  }
  var options = $.extend({}, defaults, passed_options);
  return options;
}

console.log(test({b: "hi"}));
// Object {a: "default", b: "hi"}

http://api.jquery.com/jquery.extend/ (szczególnie zwróć uwagę na możliwy parametr deep).

Edit: Jak nie używasz jQ w projekcie to polecam po prostu wydrzeć z jQ tę funkcję, albo poszukać odpowiedników dla innych FW, albo po prostu jako jakaś mała biblioteczka, bo domyślnie chyba odpowiednik $.extend nie występuje w JS (w ES6 CHYBA jest, ale bez deep - musiałbyś szukać, mi się już nie chce)

0

Czy test jest tutaj celowo z malej litery(bo nie jest to typowy konstruktor)? Czy jako konstruktor nie powinno byc to pisane z wielkiej?

Czy powinno sie w ten sposob robic (podawac defaultowe wartosci), czy w praktyce raczej sie z tego nie korzysta??

1

To tylko przykład, nie mający nic wspólnego z obiektowością.

Extend jest bardzo często używany do tego celu - i to chyba najwygodniejszy i najczytelniejszy sposób na domyślne wartości - nawet w manualu, który podesłałem jest przykład użycia tego własnie po to.

0

Okej, wielkie dzieki :)

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