joose - javascript meta object system

56
Software-Development with JavaScript and Joose Hamburg, 22.Oktober 2008

Upload: malteubl

Post on 18-Dec-2014

7.045 views

Category:

Technology


0 download

DESCRIPTION

Introduction to JavaScript development with Joose

TRANSCRIPT

Page 1: Joose - JavaScript Meta Object System

Software-Development with JavaScript and JooseHamburg, 22.Oktober 2008

Page 2: Joose - JavaScript Meta Object System

No Agenda

Agenda

Page 3: Joose - JavaScript Meta Object System

Joose isa meta object system for JavaScript

Page 4: Joose - JavaScript Meta Object System

Joose is not

a browser/DOM/Ajax/Widget library like jQuery, Prototype, YUI,

Mootools or Dojo

Page 5: Joose - JavaScript Meta Object System

Joose is not

a browser/DOM/Ajax/Widget library like jQuery, Prototype, YUI,

Mootools or Dojo You wil still very much need these when

you use Joose in the Browser

Page 6: Joose - JavaScript Meta Object System

Joose helps

_ write

_ well structured,

_ expressive,

_ declarative,

_ maintainable

_ JavaScript applications.

Page 7: Joose - JavaScript Meta Object System

Core Features

_ Classes

_ Interfaces

_ Mixins

_ Modules / Packages / Namespaces

_ Roles

_ (Mixins + Interfaces)

_ Method Modifiers

_ (think aspect oriented programming)

Page 8: Joose - JavaScript Meta Object System

Core Features

Declarative methods to build all these things

Page 9: Joose - JavaScript Meta Object System

Meta Features

Object based interface to introspect and manipulate all these things at

runtime.

Meta classes for classes, methods and attributes.

Page 10: Joose - JavaScript Meta Object System

Meta?

Page 11: Joose - JavaScript Meta Object System

Meta?

You don't need to understand the meta

features to work with Joose.

Page 12: Joose - JavaScript Meta Object System

Meta?

You don't need to understand the meta

features to work with Joose.

But it is more fun if you do :)

Page 13: Joose - JavaScript Meta Object System

Mission

Steal all the nice features from other programming languages.

Make them available in JavaScript in a way that feels native to JavaScript.

Page 14: Joose - JavaScript Meta Object System

Java, C#, etc.

_ Classes

_ Interfaces

_ Packages / Namespaces

Page 15: Joose - JavaScript Meta Object System

Smalltalk, CLOS (Common Lisp Object System)

_ Meta classes

_ Meta attributes

_ Meta methods

Page 16: Joose - JavaScript Meta Object System

Ruby

_ Mixins

_ Meta classes

Page 17: Joose - JavaScript Meta Object System

Perl 6

_ Roles

_ Method modifiers

_ Type constraints and coercions

Page 18: Joose - JavaScript Meta Object System

Perl 5

_ Moose (All of the above)

Page 19: Joose - JavaScript Meta Object System

LET‘S LOOK AT SOME CODE

Page 20: Joose - JavaScript Meta Object System

a Class

Class("Point", {

})

Page 21: Joose - JavaScript Meta Object System

with two attributes

Class("Point", { has: { x: {is: "ro"}, y: {is: "rw"}, }})

Page 22: Joose - JavaScript Meta Object System

and a clear method

Class("Point", { has: { x: {is: "ro"}, y: {is: "rw"}, }, methods: { clear: function () { this.x = 0; this.setY(0); } }})

Page 23: Joose - JavaScript Meta Object System

Inheritance

Class("Point3D", { isa: Point})

Page 24: Joose - JavaScript Meta Object System

after...

Class("Point3D", { isa: Point, has: { z: {} }, after: { clear: function () { this.z = 0; } }})

Page 25: Joose - JavaScript Meta Object System

before...

Class("Point3D", { isa: Point, has: { z: {} }, before: { clear: function () { this.z = 0; } }})

Page 26: Joose - JavaScript Meta Object System

before...

Class("Point3D", { isa: Point, has: { z: {} }, override: { clear: function () { this.SUPER(); this.z = 0; } }})

Page 27: Joose - JavaScript Meta Object System

Usage

var point = new Point3D();

point.setX(10);

var y = point.getY(10);

point.z = 1;

point.clear();

var point2 = new Point3D({ x: 10, y: 20 });

Page 28: Joose - JavaScript Meta Object System

Modules

_ create a namespace

_ create a lexical scope for your code.

_ No need for ugly

_ (function () { ... })()

Page 29: Joose - JavaScript Meta Object System

Bank.Account

Module("Bank", function (m) { Class("Account", { has: { balance: { is: "rw", init: 0 } } }})

Page 30: Joose - JavaScript Meta Object System

JSON Integration

Class("Geometry.Point", { does: Joose.Storage, has: { x: {is: rw}, y: {is: rw}, $: { is: rw, init: "stuff", persistent: false } }})

Page 31: Joose - JavaScript Meta Object System

JSON Integration

var p = new Geometry.Point({x: 10, y: 20}) var jsonSring = JSON.stringify(p); var p2 = JSON.parse(jsonString); alert(p2.getX())

Page 32: Joose - JavaScript Meta Object System

JSON Integration

var p = new Geometry.Point({x: 10, y: 20}) var jsonSring = JSON.stringify(p); var p2 = JSON.parse(jsonString); alert(p2.getX())

Turn Joose Objects into JSON and turn JSON

into Joose objects

Page 33: Joose - JavaScript Meta Object System

JSON Integration

var p = new Geometry.Point({x: 10, y: 20}) var jsonSring = JSON.stringify(p); var p2 = JSON.parse(jsonString); alert(p2.getX())

Turn Joose Objects into JSON and turn JSON

into Joose objects

Backend Integration!

Page 34: Joose - JavaScript Meta Object System

Total JavaScript Makeover!

Page 35: Joose - JavaScript Meta Object System

Classes and Namespaces in native JSif(Test == null) { Test = {};}

Test.StandardPoint = function (x, y) { this.x = x || 0 this.y = y || 0}

Test.StandardPoint.prototype = { getX: function () { return this.x }, setX: function (x) { this.x = x }, getY: function () { return this.y }, setY: function (y) { this.y = y; }, clear: function () { this.setX(0) this.setY(0) }}

Dramatization

Page 36: Joose - JavaScript Meta Object System

Classes and Namespaces in native JS

if(Test == null) { Test = {};}

Test.StandardPoint = function (x, y) { this.x = x || 0 this.y = y || 0}

Test.StandardPoint.prototype = { getX: function () { return this.x }, setX: function (x) { this.x = x }, getY: function () { return this.y }, setY: function (y) { this.y = y; }, clear: function () { this.setX(0) this.setY(0) }}

Dramatization

Page 37: Joose - JavaScript Meta Object System

Using Joose

Module("Test", function (m) { Class("Point", { has: { x: { is: "rw", init: 0 }, y: { is: "rw", init: 0 } }, methods: { clear: function () { this.setX(0); this.setY(0); } } })})

Page 38: Joose - JavaScript Meta Object System

Using Joose

Module("Test", function (m) { Class("Point", { has: { x: { is: "rw", init: 0 }, y: { is: "rw", init: 0 } }, methods: { clear: function () { this.setX(0); this.setY(0); } } })})

No need for scrolling!

Page 39: Joose - JavaScript Meta Object System

Class inheritance and method wrappers in native JS// We need a utility function to do the inheritancefunction inherit(superClass, subClass) { for(var i in superClass.prototype) { subClass.prototype[i] = superClass.prototype[i] }}

Test.StandardPoint3D = function (x, y, z) { this.x = x || 0 this.y = y || 0 this.z = z || 0}

// Make Test.Standard the super class of Test.StandardPoint3Dinherit(Test.StandardPoint, Test.StandardPoint3D)

// we cant assign a new prototype because we already have the one from the superTest.StandardPoint3D.prototype.getZ = function () { return this.z}

Test.StandardPoint3D.prototype.setZ = function (z) { this.z = z;}

var superMethod = Test.StandardPoint3D.prototype.clear;Test.StandardPoint3D.prototype.clear = function () { superMethod.apply(this); this.z = 0;}

Dramatization

Page 40: Joose - JavaScript Meta Object System

Class inheritance and method wrappers in native JS

// We need a utility function to do the inheritancefunction inherit(superClass, subClass) { for(var i in superClass.prototype) { subClass.prototype[i] = superClass.prototype[i] }}

Test.StandardPoint3D = function (x, y, z) { this.x = x || 0 this.y = y || 0 this.z = z || 0}

// Make Test.Standard the super class of Test.StandardPoint3Dinherit(Test.StandardPoint, Test.StandardPoint3D)

// we cant assign a new prototype because we already have the one from the superTest.StandardPoint3D.prototype.getZ = function () { return this.z}

Test.StandardPoint3D.prototype.setZ = function (z) { this.z = z;}

var superMethod = Test.StandardPoint3D.prototype.clear;Test.StandardPoint3D.prototype.clear = function () { superMethod.apply(this); this.z = 0;}

Dramatization

Page 41: Joose - JavaScript Meta Object System

Using Joose

Module("Test", function (m) { Class("Point3D", { isa: m.Point, has: { z: { is: "rw", init: 0 } }, after: { clear: function () { this.setZ(0) } } })})

Page 42: Joose - JavaScript Meta Object System

EXAMPLES

Page 43: Joose - JavaScript Meta Object System

Class Browser

_ http://it.test.avantaxx.de/xssinterface/projects/Joose/examples/class_browser.html

Page 44: Joose - JavaScript Meta Object System

blok

_ http://blok.appspot.com

_ http://code.google.com/p/joose-js/source/browse/trunk/examples/blok/block/ui/Element.js

_ http://code.google.com/p/joose-js/source/browse/trunk/examples/blok/block/ui/role/Focusable.js

_ http://code.google.com/p/joose-js/source/browse/trunk/examples/blok/block/ui/role/Resizable.js

Page 45: Joose - JavaScript Meta Object System

File Size

_ Minified: 56 kb

_ GZipped: 16 kb

Page 46: Joose - JavaScript Meta Object System

Speed

Should be fine if you're not building a canvas based ray tracer for real time

animations.

Profiling shows that Joose's overhead is negligible in most real world

applications.

Page 47: Joose - JavaScript Meta Object System

Speed

Should be fine if you're not building a canvas based ray tracer for real time

animations.

Profiling shows that Joose's overhead is negligible in most real world

applications.

Tell me if you do, though!

Page 48: Joose - JavaScript Meta Object System

Other Frameworks

_ Integration with jQuery works like a charm

_ YUI should be fine, too (Because YUI is very serious about namespaces).

_ Others should be fine as well

Page 49: Joose - JavaScript Meta Object System

Joose does not

_ extend any default object prototypes.

Object.prototype.boom = function () {

alert(„Dont try this at home“)

}

Page 50: Joose - JavaScript Meta Object System

Joose runs

_ in all common browsers

_ Rhino

_ JScript.NET

_ Flash comming soon

_ Ensured by an extensive automated test suite.

Page 51: Joose - JavaScript Meta Object System

Joose runs

_ in all common browsers

_ Rhino

_ JScript.NET

_ Flash comming soon

_ Ensured by an extensive automated test suite.

No extra testing in IE6 required :)

Page 52: Joose - JavaScript Meta Object System

Use cases?

Joose is not always the right tool for the job!

Page 53: Joose - JavaScript Meta Object System

Use it if

You need more than three "classes".

It makes sense to maintain page state in objects.

Page 54: Joose - JavaScript Meta Object System

Advanced Topics

_ Backend Integration

_ Prototype based object orientation

_ Everything Meta

_ DOM Binding

_ Client Side Databases

Page 55: Joose - JavaScript Meta Object System

More Info

_ http://code.google.com/p/joose-js/

_ http://joose-js.blogspot.com

Page 56: Joose - JavaScript Meta Object System

Thank You