Objektorientierte Programmierung mit JavaScript



Ähnliche Dokumente
Gebundene Typparameter

Vorkurs C++ Programmierung

Objektorientierte Programmierung

Objektorientierung: Klassen und Objekte

Objektorientiertes JavaScript

Einführung in die Programmierung

Ich liebe Java && Ich liebe C# Rolf Borst

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Prinzipien Objektorientierter Programmierung

Client-Server-Beziehungen

Neue Features in C# 2.0

Studentische Lösung zum Übungsblatt Nr. 7

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung

5. Tutorium zu Programmieren

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Einführung in die Java- Programmierung

Factory Method (Virtual Constructor)

Informatik ist viel mehr als Delphi-Programmierung!

Algorithmen und Datenstrukturen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

string: Beispiele: Test, test, `Seitentitel: ${document.title}`

Kapitel 6. Vererbung

Java-Schulung Grundlagen

C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Algorithmen und Datenstrukturen

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio /9

Klassenbeziehungen & Vererbung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Das lustige Überlebenshandbuch. Oliver Pehnke, Benjamin Schmid

Java: Vererbung. Teil 3: super()

javascript Coding-Guidelines 2. Ausgabe Februar 2015 Der Guideline beschreibt den verwendeten Coding-Stil von javascript als eigene Richtline.

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Modellierung und Programmierung 1

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kapitel 6. Vererbung

Kontrollstrukturen und Funktionen in C

Objektorientierte Programmierung

Javakurs 2013 Objektorientierung

Kapitel 6. Vererbung

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Erwin Grüner

Behandeln Sie»undefined«als»nicht vorhanden«thema 54

Vererbung & Schnittstellen in C#

Java - Programmierung - Objektorientierte Programmierung 1

Modul 122 VBA Scribt.docx

Programmieren in Java

PHP Aufbaukurs. Tag 3. PHP5 & Klassen

Coffeescript. Javascript the good parts

5.5.8 Öffentliche und private Eigenschaften

Dokumentation für Popup (lightbox)

4 Vererbung, Polymorphie

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

C# im Vergleich zu Java

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Klausur zur Einführung in die objektorientierte Programmierung mit Java

AJAX Implementierung mit Joomla!

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Code-Organisation in JavaScript

Einführung in ActionScript

Zusammenfassung des Handzettels für Programmieren in C

Einführung in die C-Programmierung

Einführung in die Programmierung für Wirtschaftsinformatik

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

5.4 Klassen und Objekte

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Einführung in die Programmierung

Programmierung in Python

JavaScript in Drupal

Die Programmiersprache C99: Zusammenfassung

Arrays Fortgeschrittene Verwendung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Web-Techniken Einführung in JavaScript

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java Kurs für Anfänger Einheit 5 Methoden

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Objektorientierte Programmierung

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

Einführung in Javadoc

Assoziation und Aggregation

Besonderheiten von C#

Objektorientierte Programmierung OOP

WPF Steuerelemente Listbox, ComboBox, ListView,

Java Einführung Collections

12) Generische Datenstrukturen

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmieren in Java

Transkript:

Ziele Objektorientierte Programmierung mit JavaScript var meta = { author: 'Malte Schmitz', date: new Date(2012, 10, 16), event: 'MetaNook' ; 1. JavaScript-Objekte und -Funkionen verwenden können 2. prototypische (differenzielle) Vererbung verstehen 3. Objektorientierte Konzepte in JavaScript kennen lernen 4. sehen, wie JavaScript-Frameworks diese umsetzen 2 Gliederung Github Teil I Einführung in JavaScript Teil II Objektorientierung mit JavaScript Teil III Objektorientierung mit JavaScript-Frameworks github.com/malteschmitz/js-oop diese Präsentation L A TEX-Quellcode JavaScript-Beispiele 3 4

Variablen JavaScript Objekte Vererbung Funktionen Funktionsaufrufe // Deklaration var a; console.log(a); // --> undefined // Initialisierung a = 42; console.log(a); // --> 42 dynamische Typisierung, nicht ungetypt Sichtbarkeitsbereich: ganze aktuelle Funktion console.log(b); // --> undefined // Deklaration und Initialisierung var b = 23; 5 6 Kontrollstrukturen var x = 13; while (x < 15) { console.log(x); // --> 13, 14 x += 1; if (x >= 15) { console.log(x); // --> 15 Objekte keine Instanz einer Klasse dynamische Sammlung von Eigenschaften (Hash, Map,... ) alles ist ein Objekt // Objekt erzeugen var o = {; // Eigenschaft setzen o.foo = 42; // Eigenschaft auslesen console.log(o.foo); // --> 42 // Eigenschaft löschen delete o.foo; 7 // Objekt erzeugen var o = {; 8

Objektliterale Iteration über Objekteigenschaften var micia = { name: 'Micia', age: 12 ; for (var key in micia) { var value = micia[key]; console.log(key + ': ' + value); 9 10 && und Duck-Typing // guard operator var name = micia && micia.name; // default operator var obj = micia {; When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck. James Whitcomb Riley if (micia.name) { console.log(micia.name); 11 12

globale Variablen differenzielle Vererbung Eigenschaften des globalen Objektes window im Browser Prototyp Prototyp ist ein GoF-Entwurfsmuster. Neue Instanzen basieren auf prototypischen Instanzen (»Vorlagen«). foo = 12; // entspricht window.foo = 12; zwischen Objekten; keine Klassen versteckter Verweis zum Prototypen beim Lesen Rückgriff auf Prototypen alle Objekte erben von Object.prototype 13 14 differenzielle Vererbung Funktionen micia proto name Micia cody proto name Cody Object.prototype var cody = {name: 'Cody'; var micia = Object.create(cody); console.log(micia.name); //--> Cody micia.name = 'Micia'; console.log(micia.name); //--> Micia delete micia.name; console.log(micia.name); //--> Cody var square = function(x) { return x * x; 15 16

Funktionen Funktionsabschluss var sum = function() { var s = 0, i = 0; for (;i < arguments.length; i++) { s += arguments[i]; return s; var makeincrementer = function(n) { return function() { return n++; a = makeincrementer(1); b = makeincrementer(5); console.log(a()); // --> 1 console.log(b()); // --> 5 console.log(a()); // --> 2 console.log(b()); // --> 6 17 18 Funktionsaufrufe Funktionsaufrufe Aufruf sum() obj.sum() sum.apply(foo) new sum() this globales Object obj foo neues Object sum(1,2,3); sum.apply(window, [1, 2, 3]); sum.call(window, 1, 2, 3); micia.add = sum; micia.add(1,2,3); sum.apply(micia, [1, 2, 3]); sum.call(micia, 1, 2, 3); 19 20

prototype-eigenschaft new-operator var f = function() {; // impliziert f.prototype = { constructor: f ; var a = new Fun(42); // entspricht var a = Object.create(Fun.prototype); var res = Fun.call(a, 42); if (res && (typeof res === 'object' typeof res === 'function')) { a = res; 21 22 new-operator Funktionen var Animal = function(name) { ; Animal.prototype.say = function(t) { ; var erwin = new Animal('Erwin'); erwin.say('hello'); // --> Erwin: Hello Funktion Methode Klasse Konstruktor Modul function() 23 24

Iteration über eigene Objekteigenschaften Object.create for (var key in micia) { if (Object.prototype. hasownproperty.apply(micia, key)) { var value = micia[key]; console.log(key + ': ' + value); if (typeof Object.create!== 'function') { Object.create = function(obj) { var F = function(){; F.prototype = obj; return new F(); 25 26 von Katzen und Hunden Objektorientierung direkt-prototypische Vererbung direkt-kopierende Vererbung pseudoklassische Vererbung prototypische Vererbung funktionale Vererbung Animal +name: String +say(t: String): void Cat +meow(): void Dog +bark(): void 27 28

Objektorientierung direkt-prototypische Vererbung Verweis versteckter Verweis zum Prototypen Kopie Kopien aller Eigenschaften des Prototyps direkt-prototypische Vererbung (Verweis) direkt-kopierende Vererbung (Kopie) pseudoklassische Vererbung (Verweis) prototypische Vererbung (Verweis) funktionale Vererbung (Kopie) var cody = { name: 'Cody', ; var micia = Object.create(cody); micia.name = 'Micia'; micia.meow = function() { ; 29 30 direkt-kopierende Vererbung direkt-kopierende Vererbung var cody = { name: 'Cody', ; var micia = {; copyproperties(cody, micia); micia.name = 'Micia'; micia.meow = function() { ; var ownprop = Object.prototype.hasOwnProperty; var copyproperties = function(from, to) { for (var key in from) { if (ownprop.call(from, key)) { to[key] = from[key]; 31 32

pseudoklassische Vererbung prototypische Vererbung var Animal = function(name) { ; Animal.prototype.say = function(t) { ; var Cat = function(name) { ; Cat.prototype = new Animal(); Cat.prototype.constructor = Cat; Cat.prototype.meow = function() { ; var micia = new Cat('Micia'); var animal = makeconstructor(object, function(name) {, { ); var cat = makeconstructor(animal, function(name) {, { meow: function() { ); var micia = cat('micia'); 33 34 prototypische Vererbung funktionale Vererbung var makeconstructor = function(extend, initializer, methods) { var proto = Object.create(extend && extend.prototype); copyproperties(methods, proto); var func = function() { var that = Object.create(proto); if (typeof initializer === 'function') { initializer.apply(that, arguments); return that; func.prototype = proto; proto.constructor = func; return func; var animal = function(name) { return { name: name, ; var cat = function(name) { var that = animal(name); that.meow = function() { return that; ; var micia = cat('micia'); 35 36

funktionale Vererbung var animal = function(name) { return { console.log(name + ': ' + t); ; var cat = function(name) { var that = animal(name); that.meow = function() { return that; ; Frameworks Underscore.js und _.extend jquery und $.extend YUI und Y.extend Backbone.js und Backbone.Model.extend MooTools und new Class Prototype und Class.create var micia = cat('micia'); 37 38 Underscore.js und _.extend direkt-kopierende Vererbung var cody = { name: 'Cody', ; var micia = {; _.extend(micia, cody, { name: 'Micia', meow: function() { ); Underscore.js und _.extend var _ = {; _.extend = function(obj) { var sources = makearray(arguments).slice(1); for (var key in sources) { var source = sources[key]; for (var prop in source) { obj[prop] = source[prop]; return obj; 39 40

jquery und $.extend direkt-kopierende Vererbung jquery und $.extend direkt-kopierende Vererbung // shallow copy var cody = { food: ['dried food', 'meat'] ; var micia = {; $.extend(micia, cody); micia.food.push('fish'); console.log(micia.food); // --> ['dried food', 'meat', 'fish'] console.log(cody.food); // --> ['dried food', 'meat', 'fish'] // deep copy var cody = { food: ['dried food', 'meat'] ; var micia = {; $.extend(true, micia, cody); micia.food.push('fish'); console.log(micia.food); // --> ['dried food', 'meat', 'fish'] console.log(cody.food); // --> ['dried food', 'meat'] 41 42 typeof ist kaputt jquery und $.type Typ undefined null Array Boolean Number String Funktion alles andere typeof 'undefined' 'object' 'object' 'boolean' 'number' 'string' 'function' 'object' var class2type = []; var types = ['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Object']; for (var i = 0; i < types.length; i++) { class2type['[object ' + types[i] + ']'] = types[i].tolowercase(); jquery.type = function(obj) { return obj == null? String(obj) : class2type[object.prototype.tostring.call(obj)] 'object'; ; 43 44

YUI und Y.extend prototypische Vererbung var Animal = function() {; Animal.prototype.say = function(t) { ; var Cat = function(name) { ; Y.extend(Cat, // the constructor to modify Animal, // the constructor to inherit { // prototype properties to add/override meow: function() { this.say('meow!'), { // static properties to add/override limit: 'sky' ); var micia = new Cat(); console.log(cat.limit); // --> sky 45 YUI und Y.extend var Y = {; // r - receiver: the function to modify // s - sender: the function to inherit from // px - prototype properties to add to r.prototype // sx - static propoperties to add to r Y.extend = function(r, s, px, sx) { r.prototype = Object.create(s.prototype); r.prototype.constructor = r; // fix constructor property of sender if (s!= Object && s.prototype.constructor == Object.prototype.constructor) { s.prototype.constructor = s; // add prototype overrides if (px) { copyproperties(px, r.prototype); // add object overrides if (sx) { copyproperties(sx, r); return r; ; 46 Backbone.js und Backbone.Model.extend prototypische Vererbung var Animal = Backbone.Model.extend({ console.log(this.get('name') + ': ' + t);, { limit: 'sky' ); var Cat = Animal.extend({ meow: function() {, { border: 'none' ); var micia = new Cat({name: 'Micia'); console.log(cat.border); // --> none console.log(cat.limit); // --> undefined MooTools und new Class prototypische Vererbung var Animal = new Class({ initialize: function(name){, ); var Cat = new Class({ Extends: Animal, this.parent(t + ', Meow!'); ); var micia = new Cat('Micia'); micia.say('hi'); // --> Micia: Hi, Meow! 47 48

MooTools und new Class kopierende Vererbung Prototype und Class.create prototypische Vererbung var Animal = new Class({ initialize: function(name){, ); var Dog = new Class({ Implements: Animal, bark: function() { this.say('woof!'); ); var cody = new Dog('Cody'); cody.bark(); // --> Cody: Woof! var Animal = Class.create({ initialize: function(name){, ); var Cat = Class.create(Animal, { say: function($super, t) { $super(t + ', Meow!'); ); var micia = new Cat('Micia'); micia.say('hi'); // --> Micia: Hi, Meow! 49 50 Zusammenfassung Crockford on JavaScript Prototypische/differenzielle Vererbung ist eine Verallgemeinerung der klassenbasierten Verberbung. Klassenbasierte Vererbung kann in JavaScript simuliert werden. Es muss zwischen Vererbung durch Verweis und Vererbung durch Kopie unterschieden werden. In der Praxis sucht man sich eines der vielen Frameworks für Objektorientierte Programmierung mit JavaScript. Volume One: The Early Years 25. Januar 2010 Chapter 2: And Then There Was JavaScript 5. Februar 2010 Act III: Function the Ultimate 17. Februar 2010 Episode IV: The Metamorphosis of Ajax 3. März 2010 Part 5: The End of All Things 31. März 2010 51 52

Bücher David Flanagan JavaScript: The Definitive Guide Douglas Crockford JavaScript: The Good Parts partielle Applikation geschützte Eigenschaften Implementierung jquery Implementierung Backbone Implementierung MooTools Implementierung Prototype 53 54 makearray partielle Applikation var makearray = function(a) { return Array.prototype.slice.call(a); ; var add = function(a,b) { return a + b; ; var inc = partial(add,1); console.log(inc(6)); // --> 7 var partial = function(func) { var fixed = makearray(arguments).slice(1); return function() { var args = makearray(arguments); return func.apply(null, fixed.concat(args)); ; ; 55 56

funktionale Vererbung var animal = function(name, secret) { secret = secret {; secret.name = name; return { console.log(secret.name + ': ' + t); var cat = function(name) { var that = animal(name); that.meow = function() { ; that.name = function() { return secret.name; return that; var micia = cat('micia'); console.log(micia.name()); // --> Micia jquery und $.extend var jquery = {, $=jquery; jquery.extend = function(deep) { var options, name, src, copy, clone, i, target = arguments[1] {; for (i = 1; i < arguments.length; i++) { if ((options = arguments[i])!= null) { for (name in options) { src = target[name]; copy = options[name]; if (deep && copy && jquery.isplainobject(copy)) { clone = jquery.isplainobject(src)? src : {; target[name] = jquery.extend(deep, clone, copy); else if (copy!== undefined) { target[name] = copy; return target; ; 57 58 jquery und $.isplainobject jquery.isplainobject = function(obj) { var ownprop = Object.prototype.hasOwnProperty; if (!obj jquery.type(obj)!== 'object' obj.nodetype obj == obj.window) { return false; if (obj.constructor &&!ownprop.call(obj, 'constructor') &&!ownprop.call(obj.constructor.prototype, 'isprototypeof')) { return false; // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. Backbone.js und Backbone.Model.extend var Backbone = { Model: function() { ; Backbone.Model.extend = function(protoprops, classprops) { var child = inherits(this, protoprops, classprops); child.extend = this.extend; return child; ; var key; for (key in obj) { return key === undefined ownprop.call(obj, key); ; 59 60

Backbone.js und Backbone.Model.extend var inherits = function(parent, protoprops, staticprops) { var child; if (protoprops && protoprops.hasownproperty('constructor')) { child = protoprops.constructor; else { child = function(){ parent.apply(this, arguments); ; // Inherit class (static) properties from parent. _.extend(child, parent); child.prototype = Object.create(parent.prototype); if (protoprops) _.extend(child.prototype, protoprops); if (staticprops) _.extend(child, staticprops); child.prototype.constructor = child; return child; ; 61 MooTools und new Class var Class = function(params){ if (typeof params === 'function') { params = {initialize: params; var newclass = function(){ reset(this); if (this.initialize) { return this.initialize.apply(this, arguments); copyproperties(this,newclass); implementproperties(params,newclass); return newclass; ; Class.Mutators = { Extends: function(parent){ this.prototype = Object.create(parent.prototype);, Implements: function(item){ implementproperties(item, this); ; 62 MooTools und new Class var implementproperties = function(from,to) { for (var key in from) { if (Object.prototype.hasOwnProperty.call(from, key)) { if (Class.Mutators.hasOwnProperty(key)){ Class.Mutators[key].call(to, from[key]); else { to.prototype[key] = from[key]; var reset = function(object){ for (var key in object){ var value = object[key]; if (typeof value === 'object') { object[key] = reset(object.create(value)); return object; ; 63 Prototype und Class.create var Class = {Methods: {; Class.create = function() { var parent = null, properties = makearray(arguments); if (typeof properties[0] === 'function') parent = properties.shift(); var klass = function() { this.initialize.apply(this, arguments); copyproperties(class.methods, klass); if (parent) { klass.prototype = Object.create(parent.prototype) klass.prototype.constructor = klass; for (var i = 0; i < properties.length; i++) klass.addmethods(properties[i]); if (!klass.prototype.initialize) klass.prototype.initialize = function() {; return klass; 64

Prototype und Class.create Prototype und Class.create Class.Methods.addMethods = function(source) { var ancestor = this.superclass && this.superclass.prototype; for (var property in source) { var value = source[property]; if (ancestor && typeof value === 'function' && argumentnames(value)[0] === '$super') { value = (function(p,v) { return function() { var a = [ancestor[p].bind(this)]. concat(makearray(arguments)); return v.apply(this, a); ; )(property, value); this.prototype[property] = value; var argumentnames = function(f) { var re = /^[\s\(]*function[^(]*\(([^)]*)\)/; var names = f.tostring().match(re)[1].replace(/\/\/.*?[\r\n] \/\*(?:. [\r\n])*?\*\//g, '').replace(/\s+/g, '').split(','); return names.length == 1 &&!names[0]? [] : names; return this; 65 66