Default-Parameter
bearbeitet von 1unitedpower> > ~~~ javascript
> > var Constructor = function (val) {
> > this.property = 'value';
> > if (val) {
> > this.property = val;
> > }
> > ~~~
>
> Angenommen this.property hätte true als Default-Wert und du möchtest ihn per Konstruktor-Parameter mit false überschreiben, dann geht das nicht, weil deine Bedingung if (val) nie wahr wird. Mit if (val !== undefined) kann man auch diesen Fall abdecken.
EcmaScript2015 bringt eine eigene Syntax für Default-Parameter mit:
~~~js
var Constructor = function (val='value') {
this.value = val;
}
~~~
> Und es ist auch besser, sich nicht mit 10 oder 20 Wiederholungen einen abzubrechen, sondern stattdessen über ein Array mit den erlaubten Eigenschaftennamen zu iterieren. Damit tritt auch das truthy/falsy-Problem nicht auf.
>
> ~~~js
> var Constructor = function (object) {
> this.first = 1;
> this.second = 2;
>
> if (typeof object == 'object') {
> ['first', 'second'].forEach(function(name) {
> if (object.hasOwnProperty(name)) {
> this[name] = object[name];
> }
> });
> }
> };
> ~~~
Ein ähnliches Ergebnis erreicht man mit Object.assign(), allerdings werden dann sämtliche Eigenschaften aus dem Parameter-Objekt übernommen, nicht nur solche, die explizit angegeben wurden.
~~~js
var Constructor = function (parameter) {
this.first = 1;
this.second = 2;
Object.assign(this,parameter);
};
~~~
Noch eleganter finde ich es, die Default-Parameter in ein eigenes Objekt auszulagern:
~~~js
var Constructor = function (parameter) {
const defaults = {
first : 1,
second : 2
};
Object.assign(this,defaults,parameter);
};
~~~
Mit Destructuring ergibt sich auch die Möglichkeit die benannte Default-Parameter in der Signatur zu notieren:
~~~js
var Constructor = function ({first = 1, second = 2}) {
Object.assign(this,arguments[0]);
}
~~~
Beim Aufruf muss dann allerdings ein Objekt übergeben werden und das funktioniert [wider Kompatibilitätstabelle](http://kangax.github.io/compat-table/es6/#destructuring_in_parameters,_'arguments'_interaction) leider nicht mit Babel (oder ist das mein Fehler?), dafür kann man sich einen Workaround basteln:
~~~js
var Constructor = function ({first= 1, second= 2}) {
Object.assign(this,{first,second});
}
~~~
Was auch wieder dedlfix' Lösung mit dem expliziten Listing der Parameter näher kommt.
[http://jsfiddle.net/pak3wddj/](http://jsfiddle.net/pak3wddj/)
Hintergrundwissen gibt Dr. Axel Rauschmayer in seinem Blog: [http://www.2ality.com/2015/01/es6-destructuring.html](http://www.2ality.com/2015/01/es6-destructuring.html)