SlideShare ist ein Scribd-Unternehmen logo
1 von 24
JavaScript ist anders
  Karlsruher Entwicklertag
       23. Juni 2009
Wer ich bin...
    Mein eigener Chef

    (Extremer) Softwareentwickler

    (Agiler) Coach

    Testgetrieben

    http://johanneslink.net
Warum JavaScript?



"Html 5 and JavaScript are the future of
Rich Client Development"
...sagt Google und handelt so
Historie
• Von Brendan Eich 1995 für Netscape
  Navigator 2 unter dem Namen
  LiveScript entwickelt
• Seit 1997 Standardisierung als
  ECMAScript
• Großes Revival mit dem Ajax-Hype
• Firefox 3.0 enthält Version 1.8 (ES 3.?)
• Die Zukunft:
  ECMAScript 3.1, 4 und „5th edition“
Java?-Script

• Curly Braces
• Syntax des Methodenaufrufs
• Einige Basistypen und Methoden:
  String, Date, toString(), ...


• Aber: Semicolons am Zeilenende
  optional
Laufzeitumgebung
• Im Browser
 ‣ Enge Verknüpfung mit DOM
 ‣ Ajax, Timer und Event-Mechanismus
 ‣ In jedem Browser im Detail unterschiedlich
 ‣ Beste Performance in Chrome

• Auf dem Server
 ‣ Via Java's Scripting-Mechanismus
 ‣ Rhino-JS nativ
 ‣ Zugriff auf Java-Objekte und -Bibliotheken
Spracheigenschaften
• Grundkonstrukte
  ‣ Funktion
  ‣ Objekt

• Funktionen sind Closures
• Keine statische Typisierung
• Alles ist öffentlich
• Prototypen:
  ‣ Objektorientiert - aber nicht klassenbasiert
Primitive Typen
var name = 'Johannes';
assertEqual('Johannes Link', name + ' Link');


var eins = 1;
assertEqual(2, eins + 1);
assertEqual('11', eins + '1');
    	
var liste = [1, 2, 'drei'];
assertEqual('drei', liste[2]);
    	
var isBig = eins > 1000;
if (isBig) fail();


assertEqual('ff', (255).toString(16));
var text = 'Dies ist ein Text.';
assertEqual(18, text.length);
assertEqual('ein Text.', text.substring(9));
Funktionen
sayHelloTo('Johannes');
  function sayHelloTo(name) {
function sayHelloTo(name) {
     return 'Hello, ' + name
  } return 'Hello, ' + name;
} sayHelloTo('Johannes')



var sayByeTo = function(name) {
    return 'Bye, ' + name;
}
sayByeTo('Michael');



 var sayByeTo = function(first, last) {
     return 'Bye, ' + name + ' ' + last
                      arguments[0];
 }
 assertEqual( ?????? , sayByeTo('Michael'))
 assertEqual('Bye, Michael undefined' , sayByeTo('Michael'))
                   Michael' , sayByeTo('Michael', 'Jordan'));
Objekte(1)
 var johannes = new Object();
 johannes.firstName = "Johannes";
 johannes.lastName = "Link";
 johannes.name = function() {
     return this.firstName + ' ' + this.lastName;
 }
 assertEqual('Johannes Link', johannes.name());


var johannes = {
  firstName: 'Johannes', lastName: 'Link',
  name: function() {
     return this.firstName + ' ' + this.lastName;
 }
}
assertEqual('Johannes Link', johannes.name());
Objekte (2)
for(var prop in johannes) {
    println(prop + ": " + johannes[prop].toString());
}


>> firstName: Johannes
>> lastName: Link
>> name: function () {...}



johannes.name = function() {
    return this.firstName.charAt(0) + '. ' + this.lastName;
}
assertEqual('J. Link', johannes.name());
Funktionen sind Objekte
 var doppelt = function() {
     return 2 * doppelt.zahl;
 }
 doppelt.zahl = 3;

 assertEqual(6, doppelt());
 assertEqual(6, doppelt.call());


doppelt.dreifach = function() {
    return this() * 2;
}
assertEqual(18, doppelt.dreifach());


function fuehreAus(eineFunktion) {
    return eineFunktion();
}
assertEqual(6, fuehreAus(doppelt));
Anonyme Funktionen
 (function(mul1, mul2) {
     return mul1 * mul2;
 })(7, 3);


function fuehreAus(eineFunktion, p1, p2) {
    return eineFunktion(p1, p2);
}
var wert = fuehreAus(function(m1, m2) {
        return m1 * m2;
    }, 7, 3);
assertEqual(21, wert);
Iteration als typischer
        Anwendungsfall
var namen = ["Johannes", "Jens", "Dierk"];
var auswahl = namen.findAll(function(name) {
         return name.match("J.*");
})
assertEqual(["Johannes", "Jens"], auswahl);


List<String> auswahl = new ArrayList<String>();
for (String name : namen) {
	 if (name.matches("J.*")) {
	 	 auswahl.add(name);
	    }
}                              Äquivalenter Java Code
Scope
var global = 1;
function fn() {
    var inFn = 2;
    assert(global == 1);
    assert(inFn == 2);
    function other() {
        var inOther = 3;
        assert(inFn == 2);
        assert(inOther == 3);
    }
    other();
    (function() {
        assert(inFn == 2);
        other();
        assert(typeof inOther == 'undefined');
    })()
}

assert(typeof(inFn) == 'undefined');
fn();
with
function outerFun() {
    return 'outer';
}

var myScope = {
    innerFun: function() {
        return 'inner';
    },
    innerVar: 4
}

with(myScope) {
    assert(outerFun() == 'outer');
    assert(innerFun() == 'inner');
    assert(innerVar == 4);
    innerVar = 3;
    newVar = 42;
}
assert(myScope.innerVar == 3);
assert(typeof myScope.newVar == 'undefined');
assert(newVar == 42);
Context
 var Fuenf = {
     malZahl: function(num) {
         return num * this.zahl;
     },
     zahl: 5;
 }
 assertEqual(10, Fuenf.malZahl(2));


var Sieben = {
    malZahl: Fuenf.malZahl,
    zahl: 7
}
assertEqual(14, Sieben.malZahl(2));
assertEqual(10, Sieben.malZahl.call(Fuenf, 2));
assertEqual(10, Sieben.malZahl.apply(Fuenf, [2]));
Closures
var myClosure;
var outerNum = 3;

(function() {
    var innerNum = 7;
    var innerFun = function(num) {
        return num * innerNum;
    }
    myClosure = function() {
        return innerFun(outerNum);
    };
})();

assertEqual(21, myClosure());
outerNum = 4;
assertEqual(28, myClosure());
Closures sind Funktionen mit
 Zugriff auf alle Funktionen
    und Variablen, die bei
 Erzeugung der Funktion im
   aktuellen Scope waren
Closure-Beispiel:
            Klick-Zähler
 var countClicks = 0;
 document.addEventListener("click", function() {
     countClicks++;
 });
 countClicks = 42;



(function() {
    var countClicks = 0;
    document.addEventListener("click", function() {
        alert(++countClicks);
    });
})();
Klasse == Konstruktor == Funktion

  function Person(firstName, lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
  }


  Person.prototype.name = function() {
  	    return this.firstName + ' ' + this.lastName;
  }


  var johannes =   new   Person('Johannes', 'Link');
  assertEqual('Johannes Link', johannes.name());
  assert(johannes instanceof Person);
Vererbung
function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}
Person.prototype.name = function() {...}

function Student(firstName, lastName, fieldOfStudy) {
    Person.call(this, firstName, lastName);
    this.fieldOfStudy = fieldOfStudy;
}
Student.prototype = new Person();
Student.prototype.describe = function() {
    return this.name() + ' is a student of ' + this.fieldOfStudy;
}

var jannek = new Student('Jannek', 'Link', 'Philosophy');
assert(jannek.describe() == 'Jannek Link is a student of Philosophy');
Geerbtes Verhalten

  Object.protoype
+ Person.prototype
+ Student.prototype
+ Instance properties
                            }     Live Update


                             }Always supersedes
_____________________         prototype proerties

= Object properties

aus John Resig: Secrets of the JavaScript Ninja
Zusammenfassung
• Highlights
 ‣Funktionen und Closures als vollwertige Objekte
 ‣Prototypen und Konstruktoren statt Klassen
 ‣keine Sichtbarkeitsbeschränkungen
 ‣Alles ist zur Laufzeit offen
 ➡ erlaubt sehr knappen Code
• Nicht behandelt
 ‣   eval()
 ‣   Reguläre Ausdrücke
 ‣   Timer und asynchrones Verhalten
 ‣   Event-Mechanismen

Weitere ähnliche Inhalte

Was ist angesagt?

Webcon 2012 Mobile Development mit Sencha Touch
Webcon 2012  Mobile Development mit Sencha TouchWebcon 2012  Mobile Development mit Sencha Touch
Webcon 2012 Mobile Development mit Sencha Touch
Thorsten Suckow-Homberg
 
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der BanensoftwareBei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
SAP SE
 

Was ist angesagt? (20)

nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
 
Skalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google Go
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
Webcon 2012 Mobile Development mit Sencha Touch
Webcon 2012  Mobile Development mit Sencha TouchWebcon 2012  Mobile Development mit Sencha Touch
Webcon 2012 Mobile Development mit Sencha Touch
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjs
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
 
Ruby, Ruby, Ruby!
Ruby, Ruby, Ruby!Ruby, Ruby, Ruby!
Ruby, Ruby, Ruby!
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
 
Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...
 
Do while
Do whileDo while
Do while
 
Schneller Einstieg in OpenCL mit C++ Bindings
Schneller Einstieg in OpenCL mit C++ BindingsSchneller Einstieg in OpenCL mit C++ Bindings
Schneller Einstieg in OpenCL mit C++ Bindings
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
 
Android Development ...and the daily challenges
Android Development ...and the daily challengesAndroid Development ...and the daily challenges
Android Development ...and the daily challenges
 
T3ak12 extbase
T3ak12 extbaseT3ak12 extbase
T3ak12 extbase
 
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der BanensoftwareBei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der Nebenläufigkeit
 
Tutorium 4
Tutorium 4Tutorium 4
Tutorium 4
 
Wundertüte Perl
Wundertüte PerlWundertüte Perl
Wundertüte Perl
 
Von Java Zu Groovy
Von Java Zu GroovyVon Java Zu Groovy
Von Java Zu Groovy
 

Ähnlich wie Java Script Ist Anders

L Sungs Vorschlag Seite15
L Sungs Vorschlag Seite15L Sungs Vorschlag Seite15
L Sungs Vorschlag Seite15
Betablocker
 

Ähnlich wie Java Script Ist Anders (10)

Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7
 
Modern angular 02_angular_mit_type_script
Modern angular 02_angular_mit_type_scriptModern angular 02_angular_mit_type_script
Modern angular 02_angular_mit_type_script
 
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeSOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
 
TypeScript
TypeScriptTypeScript
TypeScript
 
L Sungs Vorschlag Seite15
L Sungs Vorschlag Seite15L Sungs Vorschlag Seite15
L Sungs Vorschlag Seite15
 
WiSe 2014 | Softwaretechnologie I _ Funktionen, Zeiger, Strukturen, Bibliotheken
WiSe 2014 | Softwaretechnologie I _ Funktionen, Zeiger, Strukturen, BibliothekenWiSe 2014 | Softwaretechnologie I _ Funktionen, Zeiger, Strukturen, Bibliotheken
WiSe 2014 | Softwaretechnologie I _ Funktionen, Zeiger, Strukturen, Bibliotheken
 
JavaFX - 9. JUGR Stammtisch - 5. Mai 2011
JavaFX - 9. JUGR Stammtisch - 5. Mai 2011JavaFX - 9. JUGR Stammtisch - 5. Mai 2011
JavaFX - 9. JUGR Stammtisch - 5. Mai 2011
 
Java Design Pattern
Java Design PatternJava Design Pattern
Java Design Pattern
 

Mehr von jlink (8)

Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwickler
 
Agile08: Test Driven Ajax
Agile08: Test Driven AjaxAgile08: Test Driven Ajax
Agile08: Test Driven Ajax
 
Behaviour-Driven Development
Behaviour-Driven DevelopmentBehaviour-Driven Development
Behaviour-Driven Development
 
Mehr Dynamik Mit Groovy
Mehr Dynamik Mit GroovyMehr Dynamik Mit Groovy
Mehr Dynamik Mit Groovy
 
Automated Web 2.0 Testing
Automated Web 2.0 TestingAutomated Web 2.0 Testing
Automated Web 2.0 Testing
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 
XP Day Germany 2006 - Keynote
XP Day Germany 2006 - KeynoteXP Day Germany 2006 - Keynote
XP Day Germany 2006 - Keynote
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklung
 

Java Script Ist Anders

  • 1. JavaScript ist anders Karlsruher Entwicklertag 23. Juni 2009
  • 2. Wer ich bin... Mein eigener Chef (Extremer) Softwareentwickler (Agiler) Coach Testgetrieben http://johanneslink.net
  • 3. Warum JavaScript? "Html 5 and JavaScript are the future of Rich Client Development" ...sagt Google und handelt so
  • 4. Historie • Von Brendan Eich 1995 für Netscape Navigator 2 unter dem Namen LiveScript entwickelt • Seit 1997 Standardisierung als ECMAScript • Großes Revival mit dem Ajax-Hype • Firefox 3.0 enthält Version 1.8 (ES 3.?) • Die Zukunft: ECMAScript 3.1, 4 und „5th edition“
  • 5. Java?-Script • Curly Braces • Syntax des Methodenaufrufs • Einige Basistypen und Methoden: String, Date, toString(), ... • Aber: Semicolons am Zeilenende optional
  • 6. Laufzeitumgebung • Im Browser ‣ Enge Verknüpfung mit DOM ‣ Ajax, Timer und Event-Mechanismus ‣ In jedem Browser im Detail unterschiedlich ‣ Beste Performance in Chrome • Auf dem Server ‣ Via Java's Scripting-Mechanismus ‣ Rhino-JS nativ ‣ Zugriff auf Java-Objekte und -Bibliotheken
  • 7. Spracheigenschaften • Grundkonstrukte ‣ Funktion ‣ Objekt • Funktionen sind Closures • Keine statische Typisierung • Alles ist öffentlich • Prototypen: ‣ Objektorientiert - aber nicht klassenbasiert
  • 8. Primitive Typen var name = 'Johannes'; assertEqual('Johannes Link', name + ' Link'); var eins = 1; assertEqual(2, eins + 1); assertEqual('11', eins + '1'); var liste = [1, 2, 'drei']; assertEqual('drei', liste[2]); var isBig = eins > 1000; if (isBig) fail(); assertEqual('ff', (255).toString(16)); var text = 'Dies ist ein Text.'; assertEqual(18, text.length); assertEqual('ein Text.', text.substring(9));
  • 9. Funktionen sayHelloTo('Johannes'); function sayHelloTo(name) { function sayHelloTo(name) { return 'Hello, ' + name } return 'Hello, ' + name; } sayHelloTo('Johannes') var sayByeTo = function(name) { return 'Bye, ' + name; } sayByeTo('Michael'); var sayByeTo = function(first, last) { return 'Bye, ' + name + ' ' + last arguments[0]; } assertEqual( ?????? , sayByeTo('Michael')) assertEqual('Bye, Michael undefined' , sayByeTo('Michael')) Michael' , sayByeTo('Michael', 'Jordan'));
  • 10. Objekte(1) var johannes = new Object(); johannes.firstName = "Johannes"; johannes.lastName = "Link"; johannes.name = function() { return this.firstName + ' ' + this.lastName; } assertEqual('Johannes Link', johannes.name()); var johannes = { firstName: 'Johannes', lastName: 'Link', name: function() { return this.firstName + ' ' + this.lastName; } } assertEqual('Johannes Link', johannes.name());
  • 11. Objekte (2) for(var prop in johannes) { println(prop + ": " + johannes[prop].toString()); } >> firstName: Johannes >> lastName: Link >> name: function () {...} johannes.name = function() { return this.firstName.charAt(0) + '. ' + this.lastName; } assertEqual('J. Link', johannes.name());
  • 12. Funktionen sind Objekte var doppelt = function() { return 2 * doppelt.zahl; } doppelt.zahl = 3; assertEqual(6, doppelt()); assertEqual(6, doppelt.call()); doppelt.dreifach = function() { return this() * 2; } assertEqual(18, doppelt.dreifach()); function fuehreAus(eineFunktion) { return eineFunktion(); } assertEqual(6, fuehreAus(doppelt));
  • 13. Anonyme Funktionen (function(mul1, mul2) { return mul1 * mul2; })(7, 3); function fuehreAus(eineFunktion, p1, p2) { return eineFunktion(p1, p2); } var wert = fuehreAus(function(m1, m2) { return m1 * m2; }, 7, 3); assertEqual(21, wert);
  • 14. Iteration als typischer Anwendungsfall var namen = ["Johannes", "Jens", "Dierk"]; var auswahl = namen.findAll(function(name) { return name.match("J.*"); }) assertEqual(["Johannes", "Jens"], auswahl); List<String> auswahl = new ArrayList<String>(); for (String name : namen) { if (name.matches("J.*")) { auswahl.add(name); } } Äquivalenter Java Code
  • 15. Scope var global = 1; function fn() { var inFn = 2; assert(global == 1); assert(inFn == 2); function other() { var inOther = 3; assert(inFn == 2); assert(inOther == 3); } other(); (function() { assert(inFn == 2); other(); assert(typeof inOther == 'undefined'); })() } assert(typeof(inFn) == 'undefined'); fn();
  • 16. with function outerFun() { return 'outer'; } var myScope = { innerFun: function() { return 'inner'; }, innerVar: 4 } with(myScope) { assert(outerFun() == 'outer'); assert(innerFun() == 'inner'); assert(innerVar == 4); innerVar = 3; newVar = 42; } assert(myScope.innerVar == 3); assert(typeof myScope.newVar == 'undefined'); assert(newVar == 42);
  • 17. Context var Fuenf = { malZahl: function(num) { return num * this.zahl; }, zahl: 5; } assertEqual(10, Fuenf.malZahl(2)); var Sieben = { malZahl: Fuenf.malZahl, zahl: 7 } assertEqual(14, Sieben.malZahl(2)); assertEqual(10, Sieben.malZahl.call(Fuenf, 2)); assertEqual(10, Sieben.malZahl.apply(Fuenf, [2]));
  • 18. Closures var myClosure; var outerNum = 3; (function() { var innerNum = 7; var innerFun = function(num) { return num * innerNum; } myClosure = function() { return innerFun(outerNum); }; })(); assertEqual(21, myClosure()); outerNum = 4; assertEqual(28, myClosure());
  • 19. Closures sind Funktionen mit Zugriff auf alle Funktionen und Variablen, die bei Erzeugung der Funktion im aktuellen Scope waren
  • 20. Closure-Beispiel: Klick-Zähler var countClicks = 0; document.addEventListener("click", function() { countClicks++; }); countClicks = 42; (function() { var countClicks = 0; document.addEventListener("click", function() { alert(++countClicks); }); })();
  • 21. Klasse == Konstruktor == Funktion function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } Person.prototype.name = function() { return this.firstName + ' ' + this.lastName; } var johannes = new Person('Johannes', 'Link'); assertEqual('Johannes Link', johannes.name()); assert(johannes instanceof Person);
  • 22. Vererbung function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } Person.prototype.name = function() {...} function Student(firstName, lastName, fieldOfStudy) { Person.call(this, firstName, lastName); this.fieldOfStudy = fieldOfStudy; } Student.prototype = new Person(); Student.prototype.describe = function() { return this.name() + ' is a student of ' + this.fieldOfStudy; } var jannek = new Student('Jannek', 'Link', 'Philosophy'); assert(jannek.describe() == 'Jannek Link is a student of Philosophy');
  • 23. Geerbtes Verhalten Object.protoype + Person.prototype + Student.prototype + Instance properties } Live Update }Always supersedes _____________________ prototype proerties = Object properties aus John Resig: Secrets of the JavaScript Ninja
  • 24. Zusammenfassung • Highlights ‣Funktionen und Closures als vollwertige Objekte ‣Prototypen und Konstruktoren statt Klassen ‣keine Sichtbarkeitsbeschränkungen ‣Alles ist zur Laufzeit offen ➡ erlaubt sehr knappen Code • Nicht behandelt ‣ eval() ‣ Reguläre Ausdrücke ‣ Timer und asynchrones Verhalten ‣ Event-Mechanismen