Tach!
Darum müssen wir in der Konstruktorfunktion prüfen, ob ein Parameter übergeben wurde, und nur in diesem Fall wird der entsprechende Defaultwert überschrieben:
Wenn du das nur so betonst, musst du den Code aber auch so schreiben, dass das nur erfüllt wird.
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.
Die Abkürzung mit Prüfung auf truthy- oder falsy-Werte ist legitim, man muss nur genau wissen, wann man sie einsetzen kann und wann nicht. Und diese Bedingungen dürfen sich auch nicht später ändern, wenn man vorhat, die Anpassung des Konstruktors zu vergessen.
Nehmen wir nun aber einmal an, unsere Konstruktorfunktion hat nicht nur eine Eigenschaft, sondern zehn oder zwanzig, dann würden wir uns hier mit der Parametrisierung einen abbrechen. Daher ist es besser, statt einen Haufen einzelner Werte zu übergeben, diese Werte in einem Objekt zu hinterlegen, welches dann als einziges Argument übergeben wird:
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.
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];
}
});
}
};
dedlfix.