추천중입니다.
닫기 블로그로 보내기


설정된 블로그가 없습니다.

블로그 설정하기

슬라이드를 블로그에 보내는 중입니다.
Javascript 1.5 to 2.0
0
01990
chang 2008.06.17 13:55:23
마가린 바르기bookmarkr.netmetagsWzd.com네이버에 북마크하기다음에 북마크하기HanRSS에 북마크하기이올린에 북마크하기Pumfit에 글 올리기News2.0에 투고하기del.icio.us에 북마크하기
URL Copy_btn
EMBED Copy_btn
작성자가 등록한 다른 큐
댓글을 작성하기 위해서는 먼저 로그인 하셔야 합니다.
현재 댓글의 수는 0 개 입니다.
Page 0: Page 1: JavaScript 1.5 to 2.0 John Resig (ejohn.org) Mozilla Corporation Page 2: The Big Picture ECMAScript 3 JavaScript 1.5 ActionScript 2 JScript Etc. SpiderMonkey AVM JScript Engine KJS (Apple) Rhino Opera Page 3: Jav aS c rip t1 .5 t1 rip Jav aS c t1 rip aS c aS c .6 .7 Jav Jav Path to JavaScript 2 1999 2005 2006 2008 2009 Jav ript aS 1.8 cr ipt Ja 1.9 va Sc ri pt 2 Page 4: The JavaScript Language ✦ Current: JavaScript 1.5 (Firefox 1, ES3) JavaScript 1.6 (Firefox 1.5) JavaScript 1.7 (Firefox 2) JavaScipt 1.8 (Firefox 3) JavaScript 1.9 (Firefox 3.1) JavaScript 2 (Firefox 4, ES4) ✦ ✦ ✦ ✦ ✦ Page 5: JavaScript 1.5 ✦ Getters and Setters ✦ Extra power over properties ✦ Two powerful uses: ✦ Private data access ✦ Lazy-loading data var n = “John”; var obj = { get name(){ return n; }, set name(value){ n = value; } }; obj.name = “Ted”; obj.name == “Ted” // true ✦ Page 6: Getters and Setters ✦ var n = “John”; var obj = {}; obj.__defineGetter__(“name”, function(){ return n; }); obj.__defineSetter__(“name”, function(value){ n = value; }); obj.name = “Ted”; obj.name == “Ted”; // true obj.__lookupGetter__(“name”) // => function(){ return n; } // __lookupSetter__ too! ✦ Page 7: Lazy-Loading Data ✦ var pixelsDone; data.__defineGetter__(”pixels”, function(){ if ( pixelsDone ) return pixelsDone; pixelsDone = []; for ( var i = 0; i < pixels.length; i += 4 ){ pixelsDone.push( p.color(...) ); } return pixelsDone; }); obj.pixels[3] ✦ Page 8: JavaScript 1.6 ✦ Array Extras ✦ indexOf / lastIndexOf [0,1,2].indexOf(1) == 1 ✦ every / filter / some [0,1,2].every(function(val){ return val > 0; }); // false ✦ map [0,1,2].map(function(val){return val + 1;}); // [1,2,3] ✦ forEach [0,1,2].forEach(function(val,index){}); Page 9: JavaScript 1.7 ✦ Generators and Iterators ✦ Lazy-load data ✦ Database querying ✦ Threading http://www.neilmix.com/2007/02/07/ threading-in-javascript-17/ Page 10: Generators and Iterators ✦ function fib() { var i = 0, j = 1; while (true) { yield i; var t = i; i = j; j += t; } } var g = fib(); for ( var i in g ) { document.write(i + “<br>\n”); if ( i > 100 ) break; } Page 11: let ✦ ✦ ✦ ✦ Block-level statements for ( let i = 0; i < 10; i++ ) { } while ( true ) { let test = 5; } let (test = 5) { function stuff(){ return test; } } { let test = 5; { let test = 6; print(test);} print(test); } ✦ Page 12: Array Comprehension ✦ [i for ( let i = 0; i < 3; i++ )] // => [0, 1, 2] function range(begin, end) { for (let i = begin; i < end; ++i) { yield i; } } [i for each (i in range(0, 3))] ✦ Page 13: Destructuring ✦ ✦ ✦ ✦ var [newA, newB] = [a, b]; var newA = a, newB = b; [a, b] = [b, a] function test(){ return [0, 1]; } let [a, b] = test(); var [, c] = test(); var {name: name} = {name: “John”} name == “John” var {name} = {name: “John”} ✦ ✦ Page 14: JavaScript 1.8 ✦ ✦ Mostly a bug fix release Expression Closures function(x){ return x * x; } function(x) x * x; Generator Expressions function val_iter(obj) { return (obj[x] for (x in obj)); } for ( let value in val_iter(obj) ) { ... } ✦ Page 15: reduce ✦ Great for summing or concating [x for ( x in 100 )] .reduce(function(a,b) a+b); [[...],[...]] .reduce(function(a,b){ a.concat(b);}, []) reduceRight ✦ ✦ Page 16: JavaScript 1.9 ✦ Merge object properties: Object.extend( baseObj, otherObj ) Function.prototype.bind() fn.bind(someThis) “ string ”.trim() // => “string” mozilla.hashcode(someObj) // => 1234 (unique ID) ✦ ✦ ✦ Page 17: defineProperty ✦ Object.defineProperty(obj, name, value, types) var obj = {}; Object.defineProperty(obj, “name”, “John”, Object.NOT_WRITABLE | Object.NOT_DELETABLE); obj.name = “Test”; obj.name == “John”; delete obj.name obj.name == “John”; ✦ Page 18: JSON ✦ mozilla.JSON.parse(“{name:’John’}”) // => {name: ‘John’} mozilla.JSON.serialize({name:’John’}) // => “{name:’John’}” ✦ Page 19: Catchalls ✦ var props = {}; var obj = { test: true, get *(name){ return props[name]; }, set *(name, value){ props[name] = value; } } obj.__defineGetter_(“”, function(){}) ✦ Page 20: JavaScript 2 Goals ✦ ✦ ✦ ✦ ✦ ✦ Backwards Compatible Suitable to developing large systems Allow for reusable libraries Merge previous efforts (ActionScript) Fix ECMAScript 3 bugs Keep it usable for small programs Page 21: Features ✦ ✦ ✦ ✦ ✦ ✦ ✦ ✦ Classes and Interfaces Packages and Namespaces Type Annotations Strict Verification Optimization Syntax Shortcuts Iterators and Generators Self-hosting Page 22: The Direction ECMAScript 4 JavaScript 2 ActionScript 4 JScript Screaming Monkey Etc. Tamarin KJS (Apple) Opera Page 23: Tamarin ✦ Tamarin ✦ New Virtual Machine from Adobe ✦ Perfect for ActionScript ✦ (a mutant cousin of JavaScript 2) The Three Monkeys: ✦ ActionMonkey ✦ ScreamingMonkey ✦ IronMonkey ✦ Page 24: Three Monkies ✦ ActionMonkey ✦ Integrating Tamarin into SpiderMonkey ✦ Powering Firefox 4 (?) + JavaScript 2 ScreamingMonkey ✦ Forcing Tamarin into Internet Explorer ✦ (Kicking and screaming?) IronMonkey ✦ Bringing Python + Ruby to Tamarin ✦ ✦ Page 25: Classes Page 26: Classes ✦ class Programmer { var name; var city = “Boston, MA”; const interest = “computers”; function work() {} } var p = new Programmer; p.name = “John”; p.work(); p.work.apply( someotherp ); p.interest = “science”; // Error ✦ Page 27: Dynamic Classes ✦ dynamic class Programmer { var name; var city = “Boston, MA”; const interest = “computers”; function work() {} } var p = new Programmer; p.lastName = “Resig”; for ( var i in p ) alert( i ); // alert( “Resig” ); ✦ Page 28: Getters and Setters ✦ class Programmer { var _name; function get name(){ return _name; } function set name(value){ _name = value + “ Resig”; } } var p = new Programmer; p.name = “John”; alert( p.name ); // “John Resig” ✦ Page 29: Catch-Alls ✦ dynamic class Programmer { meta function get(name) { ... } meta function set(name, value) { alert(“Setting “ + name + “ to “ + value); } } var p = new Programmer p.name = “John”; // alert(“Setting name to John”); ✦ Page 30: Inheritance ✦ class Artist { function draw() { alert(“Drawing!”); } } class Designer extends Artist { override function draw() { alert(“Designing!”); } } var d = new Designer d.draw(); // alert(“Designing!”); ✦ Page 31: Inheritance (cont.) ✦ ✦ ‘final’ methods can’t be overriden class Artist { final function draw() {alert(“Drawing!”);} } class Designer extends Artist { // ERROR: Can’t override draw! override function draw() { alert(“Designing!”); } } Page 32: Inheritance (cont.) ✦ ✦ ‘final’ classes can’t be inherited from final class Artist { function draw() { alert(“Drawing!”); } } // ERROR: Can’t inherit from Artist class Designer extends Artist { override function draw() { alert(“Designing!”); } } Page 33: Metaclass ✦ Provide global functions and properties on a class object class Users { static function find( name ) { // ... } } Users.find( “John” ); ✦ ✦ Page 34: Interfaces ✦ ✦ Verify that a class implements another class Artist { function draw(); } class Designer implements Artist { function draw() { alert(“Designing!”); } } ✦ if ( Designer is Artist ) alert(“Designers are Artists!”); Page 35: Types Page 36: Types ✦ Types are broken down into: ✦ string ✦ double (ECMAScript 3-style Number) ✦ boolean Page 37: Type Annotations ✦ ✦ ✦ var name : string = “John”; let x : double = 5.3; function stuff( x: string, obj: Object ) : boolean {} Page 38: Function Types ✦ Only return specific types: function isValid() : boolean { } Only be used on certain objects types: function every( this: Array ) { for ( var i = 0; i < this.length; i++ ) alert( this[i] ); } every.call( [0,1,2] ); // alert(0); alert(1); alert(2); every.call({a: “b”}); // ERROR ✦ Page 39: Rest Arguments ✦ function stuff( name, ...values ){ alert( values.length ); } stuff( “John”, 1, 2, 3, 4 ); // alert( 4 ); function stuff( name : string, ...values : [double] ) : void { alert( values.length ); } var array = [1,2,3,4]; stuff( “John”, ...array ); ✦ ✦ ✦ Page 40: Union and Any Types ✦ var test : (string, double) = “test”; test = 3; test = {}; // ERROR These are equivalent: ✦ var test : * = “test”; ✦ var test = “test”; ✦ Page 41: Type Definitions ✦ ✦ type Point = { x: double, y: double }; var p : Point = { x: 3.0, y: 24.0 }; Page 42: Nullability ✦ Prevent variables from accepting null values var name : * = “John”; var name : string! = “John”; name = “Ted”; name = null; // ERROR function test( name: string? ) { alert( name ); } ✦ ✦ ✦ Page 43: Initialization ✦ class User { var name : string!; // Must be initialized function User( n ) : name = n { // ... } } Page 44: “like” ✦ ✦ type Point = { x: double, y: double }; if ( { x: 3, y: 5 } like Point ) alert( “That looks like a point to me!” ); if ( !({ x: 3 } like Point) ) alert( “Not a point!” ); // Loop over array-like things: function every( a: like { length: double } ) { for ( var i = 0; i < a.length; i++ ) alert( a[i] ); } ✦ ✦ Page 45: Parameterized Types ✦ ✦ var m: Map.<string, *>; class Point.<T> { var x: T, y: T; } var p = new Point.<double>; p.x = 3.0; p.y = 5.0; ✦ Page 46: Structure Page 47: Namespaces ✦ ✦ namespace extra = “extra”; Pre-defined namespaces: ✦ __ES4__ ✦ intrinsic ✦ iterator ✦ meta Namespaced variables: iteration::StopIteration intrinsic::readFile ✦ Page 48: Multimethods ✦ generic function intersect(s1, s2); generic function intersect(s1: Shape, s2: Shape ) { // ... } generic function intersect(s1: Rect, s2: Rect ) { // ... } generic function test(a: Object?, b... generic function test(a: Object! ✦ ✦ Page 49: Iteration ✦ class Fib { private var a=0, b=1; iterator function get(deep:boolean = false) : IteratorType.<double> this public function next(): double { if ( b > 100 ) throw iterator::StopIteration; [a,b] = [b,a+b]; return a; } } for ( let i in new Fib ) alert( i ); ✦ Page 50: For .. Each ✦ ✦ For each loops through values let s = “”; for each ( let n in [“a”,”b”,”c”] ) s += n; alert(s); // “abc” Page 51: Self-Hosting Page 52: Map.es ✦ The reference implementation’s classes are written in ECMAScript package { use namespace intrinsic; use default namespace public; intrinsic class Map.<K,V> { static const length = 2; function Map(equals=intrinsic::===, hashcode=intrinsic::hashcode) : equals = equals , hashcode = hashcode , element_count = 0 { } // ... } ✦ Page 53: More Info ✦ ✦ ECMAScript 4 Progress: http://spreadsheets.google.com/ccc?key=pFIHldY_CkszsFxMkQOReAQ&hl=en ECMAScript 4 White Paper Overview: http://www.ecmascript.org/es4/spec/overview.pdf ✦ Blogging: http://ejohn.org/ Page 54: