Verständisfrage

jemand anders

Erfahrenes Mitglied
Hallo,

warum ist im Script unten bei return der Wert "carManager[name] &&" notwendig? Wenn der Wert fehlt, läuft es nicht, aber warum?
Noch etwas, warum kann ich "apply( carManager," durch "apply( x," ersetzen, und es läuft dennoch?


Gruß


Javascript:
// https://addyosmani.com/resources/essentialjsdesignpatterns/book/#factorypatternjavascript

// test-command-pattern.js

//(function(){
 
  var carManager = {
 
    // request information
    requestInfo: function( model, id ){
      console.log("Log: The information for " + model + " with ID " + id + " is foobar");
      return "Ret: The information for " + model + " with ID " + id + " is foobar";
    },
 
    // purchase the car
    buyVehicle: function( model, id ){
      console.log( "Log: You have successfully purchased Item " + id + ", a " + model);
      return "Ret: You have successfully purchased Item " + id + ", a " + model;
    },
 
    // arrange a viewing
    arrangeViewing: function( model, id ){
      console.log("Log: You have successfully booked a viewing of " + model + " ( " + id + " ) ");
      return "Ret: You have successfully booked a viewing of " + model + " ( " + id + " ) ";
    }
 
  };
 
//})();
 
console.clear();

carManager.execute = function ( name ) {
  //console.log(typeof name + " name = " + name)
  //console.log(carManager[name]);
  //console.log(arguments.length);
  //console.log(carManager[name])
    return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
};

//console.log('exe')
carManager.execute( "xyz", "VW", "12345" );
//console.log('exe')
carManager.execute( "arrangeViewing", "Ferrari", "14523" );
//console.log('exe')
carManager.execute( "requestInfo", "Ford Mondeo", "54323" );
//console.log('exe')
carManager.execute( "requestInfo", "Ford Escort", "34232" );
//console.log('exe')
carManager.execute( "buyVehicle", "Ford Escort", "34232" );
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Scheint mir eine ziemlich blödsinnige Trickprogrammierung zu sein, was passiert ist offenbar folgendes: Zunächst wird links vom && geprüft ob carManger[name] existiert. Ist das nicht der Fall ist hier Ende da UND-Verknüpfung und die Anweisung rechts vom && wird nicht ausgeführt. Existiert es dagegen, wird sie ausgeführt. Also im Endeffekt das selbe wie dieses:
Code:
if (carManager[name]) {
    carManager[name].apply( carManager, [].slice.call(arguments, 1);
}
 

jemand anders

Erfahrenes Mitglied
Nicht ganz, denn wenn man "(carManager[name])" z. B. durch true ersetzt, erscheint eine Fehlermeldung bei Ausführung des ersten Executes.
 

Sempervivum

Erfahrenes Mitglied
Natürlich, dann wird ja nicht mehr geprüft ob carManager[name] existiert. Tut es das nicht, läuft man in der rechten Anweisung in einen Fehler.
 

jemand anders

Erfahrenes Mitglied
Stimmt. War zu kurz gedacht von mir.
Javascript:
return true && carManager["name"].apply( carManager, [].slice.call(arguments, 1) );
Erzeugt Fehler: Uncaught TypeError: carManager.name is undefined
Javascript:
return true && carManager["arrangeViewing"].apply( carManager, [].slice.call(arguments, 1) );
Läuft durch.
 

Quaese

Moderator
Moderator
Noch etwas, warum kann ich "apply( carManager," durch "apply( x," ersetzen, und es läuft dennoch?
Hi,

das erste Argument der apply-Methode repräsentiert die this-Referenz, auf der apply ausgeführt wird. Wird carManager durch x ersetzt, so entspricht die Referenz undefined. Das entspricht im non-strict-mode einem gültigen Datentyp und wird mit dem globalen Objekt (window) ersetzt.

Ciao
Quaese
 

jemand anders

Erfahrenes Mitglied
Hi,
ein nochmaliger Test ergab gerade, dass es mit "x" nicht läuft: "Uncaught ReferenceError: x is not defined". Mit window funktioniert es allerdings in der Tat, auch mit "undefined".
Keine Ahnung, warum es beim Einstellen des Themas auch mit "x" ging.
Gruß