SlideShare a Scribd company logo
Advanced JavaScript: closures, prototypes, inheritance Stoyan Stefanov Ajax Experience, Boston 2008
About the presenter Yahoo! performance    team member YSlow 2.0 architect, dev Book author, open-source    contributor Blog:  http:// phpied.com
Before we start… Firebug console
Firebug console is a learning tool
Firebug console… Inspect the contents of objects by clicking on them Tab auto-complete, a.k.a cheatsheet Arrows ↑ and↓ Fiddle with any page
Any page…
Fiddle…
Objects
JavaScript data types primitive   and  objects number string boolean undefined null
What’s an object? a hash of key => value pairs if a key ( property ) happens to be a function, we can call it a  method
What’s an object? var  obj =  { shiny:  true , isShiny:  function () { return   this .shiny; } } ; obj.isShiny();  // true
Object literal notation {  Wrapped in curly braces  } , -delimited properties key : value pairs var obj = {a: 1, "b c d": 2};
Arrays
Arrays arrays are also objects auto-incremented properties
Arrays >>>  var  a = [1,3,2]; >>> a[0] 1 >>>  typeof  a "object"
Arrays array objects also get some cool properties... >>> a. length 3 ...and methods >>> a. sort () >>> a. join ( ' < ' ) &quot;1 < 2 < 3&quot;
Array literal notation var  array = [  &quot;Square&quot; ,  &quot;brackets&quot; ,   &quot;wrap&quot; ,  &quot;the&quot; ,   &quot;comma-delimited&quot; , &quot;elements&quot; ];
JSON JavaScript Object Notation Uses object and array literals Quotes required for properties {&quot;num&quot;:  1 , &quot;str&quot;:  &quot;abc&quot; , &quot;arr&quot;: [ 1 , 2 , 3 ]}
Functions
Functions functions are objects they have properties they have methods can de copied, deleted, augmented... special feature: invokable
Functions function  boo(what) { return  what; } or var  boo =  function (what) { return  what; } ;
Functions function  boo(what) { return  what; } or var  boo =  function   bootoo (what) { return  what; } ;
Functions are objects >>> boo.length 1 >>> boo.name &quot;bootoo&quot;
Functions are objects >>>  var  foo = boo; >>> foo( &quot;doodles&quot; ) &quot;doodles&quot; >>> foo. call ( null ,  &quot;moo!&quot; ); &quot;moo!&quot;
Return value all functions return a value if they don't explicitly, they return  undefined  implicitly functions can return other functions
Constructors
Constructors when invoked with  new , functions return an object known as  this you have a chance of modifying  this  before it's returned you can also return some other object
Constructor functions var  Person =  function (name) { this .name = name; this .speaks =  'fr' ; this .say = function() { return  &quot;Je m'appelle &quot;  +  this .name; }; };
An object created with constructor >>>  var  julien =  new  Person( &quot;Julien&quot; ); >>> julien.say(); &quot;Je m'appelle Julien&quot;
Constructor’s return value var  Person =  function (){ this .first =  &quot;Bruce&quot; ;  return  {last:  &quot;Wayne&quot; }; }; >>>  typeof new  Person().first &quot;undefined&quot; >>>  new  Person().last &quot;Wayne&quot;
Constructor’s return value var  Person =  function (){ this .first =  &quot;Bruce&quot; ;  return   &quot;Batman&quot; ; }; >>>  new  Person().first &quot;Bruce&quot;
Naming convention M yConstructor m yFunction
constructor  property >>>  function  Person(){}; >>>  var  jo =  new  Person(); >>> jo. constructor  === Person true
constructor  property >>>  var  o = {}; >>> o. constructor  === Object true >>> [1,2]. constructor  === Array true
Built-in constructor functions Object Array Function RegExp Number String Boolean Date Error, SyntaxError, ReferenceError…
var fn = new Function( 'a, b','return a+b'); var fn = function(a, b){ return a + b; } var re = new RegExp( '[a-z]', 'gmi'); var re = /[a-z]/gmi; var a = new Array(); var a = []; var o = new Object(); var o = {}; Not that Use this
Wrapper objects vs. primitive >>>  typeof new Number ( 1 ) &quot;object&quot; >>>  typeof   1 &quot;number&quot;
Primitives can act as objects >>>  &quot;test&quot; . length 4 >>> ( 123.456 ). toFixed ( 2 ) &quot;123.46&quot;
Prototype
prototype a property of the function objects >>>  var  boo =  function (){}; >>>  typeof  boo. prototype &quot;object&quot;
Prototypes can be augmented >>> boo. prototype .a =  1 ; >>> boo. prototype .sayAh =  function (){};
Prototypes can be overwritten >>> boo. prototype  = {a:  1 , b:  2 };
How is the prototype used? when a function is invoked as a constructor var  Person =  function (name) { this .name = name; }; Person. prototype .say =  function () { return this .name; }
>>>  var  dude =  new  Person( 'dude' ); >>> dude.name; &quot;dude&quot; >>> dude.say(); &quot;dude&quot; How is the prototype used?
say()  is a property of the  prototype  object but it behaves as if it's a property of the  dude  object can we tell the difference? How is the prototype used?
Own properties vs. prototype’s >>> dude. hasOwnProperty ( 'name' ); true >>> dude. hasOwnProperty ( 'say' ); false
isPrototypeOf() >>> Person. prototype . isPrototypeOf (dude); true >>>  Object . prototype . isPrototypeOf (dude); true
__proto__ I, the  dude , have a secret link to the prototype of the constructor that created me __proto__  is not directly exposed in all browsers
>>> dude. __proto__ . hasOwnProperty ( 'say' ) true >>> dude. prototype ???  // Trick question >>> dude. __proto__ . __proto__ . hasOwnProperty ( 'toString' ) true __proto__
The prototype chain
It’s alive! >>>  typeof  dude.numlegs &quot;undefined&quot; >>> Person. prototype .numlegs =  2 ; >>> dude.numlegs 2
Inheritance
Inheritance via the prototype >>>  var  Dad =  function (){ this .family =  &quot;Stefanov&quot; ;}; >>>  var  Kid =  function (){}; >>> Kid. prototype  =  new  Dad(); >>>  var  billy =  new  Kid(); >>> billy.family &quot;Stefanov&quot;
Inherit one more time >>>  var  GrandKid =  function (){}; >>> GrandKid. prototype  = billy; >>>  var  jill =  new  GrandKid(); >>> jill.family &quot;Stefanov&quot;
Inheritance… >>> jill. hasOwnProperty ( 'family' ) false >>> jill. __proto__ . hasOwnProperty ( 'family' ) false >>> jill. __proto__ . __proto__ . hasOwnProperty ( 'family' ) true
Inheritance… >>> billy.family =  'Idol' ; >>> jill.family; 'Idol' >>> jill. __proto__ . hasOwnProperty ( 'family' ); true >>>  delete  billy.family; >>> jill.family; 'Stefanov'
Side effect… >>> billy. constructor  === Kid false >>> billy. constructor  === Dad true
Side effect… easy to solve reset after inheritance >>> Kid. prototype . constructor  = Kid; >>> GrandKid. prototype . constructor  = GrandKid;
isPrototypeOf >>> billy. isPrototypeOf (jill) true >>> Kid. prototype . isPrototypeOf (jill) true
instanceof >>> jill  instanceof  GrandKid true >>> jill  instanceof  Kid true >>> jill  instanceof  Dad true
Classes? There are no classes in JavaScript Objects inherit from objects class ical inheritance is when we think of constructors as if they were classes
Classical inheritance function  Parent(){ this .name =  'parent' ;} Parent. prototype .getName =  function (){   return this .name; }; function  Child(){} inherit(Child, Parent);
Option 1 function  inherit(C, P) { C. prototype  =  new  P(); }
Option 2 function  inherit(C, P) { C. prototype  = P. prototype ; }
Option 3 function  inherit(C, P) { var  F =  function (){}; F. prototype  = P. prototype ; C. prototype  =  new  F(); }
Option 3 + super function  inherit(C, P) { var  F =  function (){}; F. prototype  = P. prototype ; C. prototype  =  new  F(); C.uber = P. prototype ; }
Option 3 + super + constructor reset function  inherit(C, P) { var  F =  function (){}; F. prototype  = P. prototype ; C. prototype  =  new  F(); C.uber = P. prototype ;  // super C. prototype . constructor  = C;  // reset }
Inheritance by copying properties After all, inheritance is all about code reuse function  extend(parent) { var  i, child = {}; for  (i  in  parent) { child[i] = parent[i]; } return  child; }
Inheritance by copying… >>>  var  parent = {a:  1 }; >>>  var  child = extend(parent); >>> child.a 1
Inheritance by copying… This was a shallow copy you can make a deep copy using recursion mixins / multiple inheritance
Prototypal inheritance as suggested by Douglas Crockford no class-like constructors involved objects inherit from objects via the prototype
Prototypal inheritance function  object(o) { function  F(){} F. prototype  = o; return new  F(); }
Prototypal inheritance >>>  var  parent = {a:  1 }; >>>  var  child = object(parent); >>> child.a; 1 >>> child. hasOwnProperty (a); false
Scope
No block scope >>> if ( true ) { var  inside_block =  1 ;} >>> inside_block 1
Function scope function  boo() { var  inboo =  true ; }
Global namespace every variable is global unless it's in a function and is declared with  var global namespace should be kept clean to avoid naming collisions function scope can help
Self-executable functions for  one-off tasks ( function (){ var  a =  1 ; var  b =  2 ; alert (a + b); } )()
Closures
Photo credit:  NASA
 
Closure example #1 function  outer(){ var  local =  1 ; return   function (){ return  local; }; }
example #1… >>>  var  inner = outer() >>> inner() 1
Closure example #2 var  inner; function  outer(){ var  local =  1 ; inner =  function (){ return  local; }; }
example #2… >>>  typeof  inner &quot;undefined&quot; >>> outer() >>> inner() 1
Closure example #3 function  makePlus(arg) { var  n =  function (){ return  arg; }; arg++; return  n; }
example #3… >>>  var  getValue = makePlus( 1234 ); >>> getValue() 1235
Closure #4 – in a loop function  make() { var  i, a = []; for (i =  0 ; i <  3 ; i++) { a[i] =  function (){ return  i; } } return  a; }
Closure #4 test - oops >>>  var  funcs = make(); >>> funcs[ 0 ](); 3 >>> funcs[ 1 ](); 3 >>> funcs[ 2 ](); 3
Closure #4 – corrected function  make() { var  i, a = []; for (i =  0 ; i <  3 ; i++) { a[i] = ( function (local){ return   function (){ return  local;} })(i) } return  a; }
Getter/Setter var  getValue, setValue; ( function () { var  secret =  0 ; getValue =  function (){ return  secret; }; setValue =  function (v){ secret = v; }; })() // usage >>> getValue() 0 >>> setValue( 123 ) >>> getValue() 123
Iterator function  setup(x) { var  i =  0 ; return   function (){ return  x[i++]; }; }
Iterator usage >>>  var  next = setup([ 'a' ,  'b' ,  'c' ]); >>> next() 'a' >>> next() 'b'
Loop through DOM elements - wrong // all elements will alert 5 for (var i = 1; i < 5; i++ ){ document.getElementById('btn'+i).onclick = function(){ alert(i); }; }
Loop through DOM elements - correct // first element alerts 1, second 2,... for (var i = 1; i < 5; i++ ){ document.getElementById('btn'+i).onclick = ( function( i ){ return function(){ alert(i); }; } )(i) }
Wrapping up… How to tell what’s going on? typeof, instanceof, isPrototypeOf()…
>>>  typeof   variable typeof  is an operator, not a function Not  typeof(variable)  even if it works Returns a string, one of: &quot;string&quot;, &quot;number&quot;, &quot;boolean&quot;,  &quot;undefined&quot;, &quot;object&quot;, &quot;function&quot;
typeof if  ( typeof  whatever ===  &quot;undefined&quot;)  { // whatever is not defined } if  (whatever == undefined) { // hmm, not so sure }
>>> obj  instanceof   MyConstructor Not  instanceof() Returns  true  |  false true  for all constructors up the chain
>>> obj. constructor Points to the constructor function used to create this  obj
>>> obj. isPrototypeOf (child_obj) Respects the prototype chain
>>> obj. hasOwnProperty ( &quot;prop&quot; ) Own properties vs. properties of the prototype
obj. propertyIsEnumerable ( &quot;prop&quot; ) Will it show up in a  for-in  loop Caution: enumerable properties of the prototype will return  false  but still show up in the for-in loop
Wrapping up… What did we learn today?
Objects JavaScript has a few primitive types, everything else is an object Objects are hashes Arrays are objects
Functions Functions are objects, only invokable call()  and  apply()  methods prototype  property
Prototype Functions have a  prototype  property which is an object Useful with Constructor functions
Constructor A function meant to be called with  new Returns an object
Class No such thing in JavaScript
Inheritance Prototypal Class ical … and approximately 101 other ways and variations
Scope Lexical function scope
Closure When a variable leaves its function scope
Thank you! Stoyan Stefanov http://www.phpied.com

More Related Content

PDF
Object Oriented Programming in JavaScript
zand3rs
 
PPT
Advanced JavaScript
Fu Cheng
 
PDF
Advanced javascript
Doeun KOCH
 
PPT
Advanced Javascript
Adieu
 
PPTX
Lab #2: Introduction to Javascript
Walid Ashraf
 
PDF
A quick and fast intro to Kotlin
XPeppers
 
PPTX
JavaScript Promises
L&T Technology Services Limited
 
PDF
JavaScript: Variables and Functions
Jussi Pohjolainen
 
Object Oriented Programming in JavaScript
zand3rs
 
Advanced JavaScript
Fu Cheng
 
Advanced javascript
Doeun KOCH
 
Advanced Javascript
Adieu
 
Lab #2: Introduction to Javascript
Walid Ashraf
 
A quick and fast intro to Kotlin
XPeppers
 
JavaScript Promises
L&T Technology Services Limited
 
JavaScript: Variables and Functions
Jussi Pohjolainen
 

What's hot (20)

PPSX
Kotlin Language powerpoint show file
Saurabh Tripathi
 
PDF
Basics of JavaScript
Bala Narayanan
 
PDF
Demystifying Prototypes
Dmitry Baranovskiy
 
PDF
Angular Routing Guard
Knoldus Inc.
 
PPTX
Kotlin presentation
MobileAcademy
 
PPTX
Spring 3.x - Spring MVC - Advanced topics
Guy Nir
 
PPTX
Hibernate ppt
Aneega
 
PPTX
Javascript 101
Shlomi Komemi
 
PPT
Xml Schema
vikram singh
 
PPT
Inheritance in C++
Shweta Shah
 
PPTX
React js
Oswald Campesato
 
PDF
Asp.net state management
priya Nithya
 
PPTX
Dom date and objects and event handling
smitha273566
 
PPTX
Introduction to React JS for beginners
Varun Raj
 
PPT
Oops concepts in php
CPD INDIA
 
PDF
Angular Directives
iFour Technolab Pvt. Ltd.
 
PDF
JavaScript - Chapter 3 - Introduction
WebStackAcademy
 
PPTX
9. ES6 | Let And Const | TypeScript | JavaScript
pcnmtutorials
 
Kotlin Language powerpoint show file
Saurabh Tripathi
 
Basics of JavaScript
Bala Narayanan
 
Demystifying Prototypes
Dmitry Baranovskiy
 
Angular Routing Guard
Knoldus Inc.
 
Kotlin presentation
MobileAcademy
 
Spring 3.x - Spring MVC - Advanced topics
Guy Nir
 
Hibernate ppt
Aneega
 
Javascript 101
Shlomi Komemi
 
Xml Schema
vikram singh
 
Inheritance in C++
Shweta Shah
 
Asp.net state management
priya Nithya
 
Dom date and objects and event handling
smitha273566
 
Introduction to React JS for beginners
Varun Raj
 
Oops concepts in php
CPD INDIA
 
Angular Directives
iFour Technolab Pvt. Ltd.
 
JavaScript - Chapter 3 - Introduction
WebStackAcademy
 
9. ES6 | Let And Const | TypeScript | JavaScript
pcnmtutorials
 
Ad

Viewers also liked (16)

PDF
Reactive JavaScript
Stoyan Stefanov
 
KEY
2012 oct-12 - java script inheritance
pedro.carvalho
 
PDF
JavaScript Inheritance
Jussi Pohjolainen
 
PDF
Javascript foundations: Inheritance
John Hunter
 
PDF
New ES6 Hotness
Pawel Szymczykowski
 
PDF
JavaScript Inheritence
Pawel Szymczykowski
 
ODP
Basic inheritance in JavaScript
Brian Moschel
 
PDF
JavaScript: The prototype Property
Guillermo Paz
 
PPTX
Advanced JavaScript
Nascenia IT
 
PDF
libGDX: Screens, Fonts and Preferences
Jussi Pohjolainen
 
PDF
JavaScript Prototype and Module Pattern
Narendra Sisodiya
 
PDF
JavaScript OOPs
Johnson Chou
 
PPTX
ASP.NET Core: The best of the new bits
Ken Cenerelli
 
PPTX
Prototype & Inheritance in JavaScript
Sunny Sharma
 
PPTX
ASP.NET Core 1.0 Overview
Shahed Chowdhuri
 
PDF
JavaScript for PHP developers
Stoyan Stefanov
 
Reactive JavaScript
Stoyan Stefanov
 
2012 oct-12 - java script inheritance
pedro.carvalho
 
JavaScript Inheritance
Jussi Pohjolainen
 
Javascript foundations: Inheritance
John Hunter
 
New ES6 Hotness
Pawel Szymczykowski
 
JavaScript Inheritence
Pawel Szymczykowski
 
Basic inheritance in JavaScript
Brian Moschel
 
JavaScript: The prototype Property
Guillermo Paz
 
Advanced JavaScript
Nascenia IT
 
libGDX: Screens, Fonts and Preferences
Jussi Pohjolainen
 
JavaScript Prototype and Module Pattern
Narendra Sisodiya
 
JavaScript OOPs
Johnson Chou
 
ASP.NET Core: The best of the new bits
Ken Cenerelli
 
Prototype & Inheritance in JavaScript
Sunny Sharma
 
ASP.NET Core 1.0 Overview
Shahed Chowdhuri
 
JavaScript for PHP developers
Stoyan Stefanov
 
Ad

Similar to Advanced JavaScript (20)

PPT
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 
PPT
JavaScript In Object Oriented Way
Borey Lim
 
PPT
Advanced Javascript
Manikanda kumar
 
PPT
Advanced Javascript
relay12
 
PDF
JS Level Up: Prototypes
Vernon Kesner
 
KEY
Javascript tid-bits
David Atchley
 
PPTX
Ajaxworld
deannalagason
 
PDF
Prototype
Aditya Gaur
 
PPT
Javascript Object Oriented Programming
Bunlong Van
 
PPTX
Object Oriented JavaScript
Julie Iskander
 
PDF
Js objects
anubavam-techkt
 
PDF
Prototype 120102020133-phpapp02
plutoone TestTwo
 
PDF
JavaScript Survival Guide
Giordano Scalzo
 
PDF
JavaScript Essentials
Triphon Statkov
 
PPTX
Ian 20150116 java script oop
LearningTech
 
PPTX
Typescript barcelona
Christoffer Noring
 
PDF
Java Script Workshop
Dmitry Baranovskiy
 
PDF
The many facets of code reuse in JavaScript
Leonardo Borges
 
PPTX
Oojs 1.1
Rodica Dada
 
PPTX
OO in JavaScript
Gunjan Kumar
 
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 
JavaScript In Object Oriented Way
Borey Lim
 
Advanced Javascript
Manikanda kumar
 
Advanced Javascript
relay12
 
JS Level Up: Prototypes
Vernon Kesner
 
Javascript tid-bits
David Atchley
 
Ajaxworld
deannalagason
 
Prototype
Aditya Gaur
 
Javascript Object Oriented Programming
Bunlong Van
 
Object Oriented JavaScript
Julie Iskander
 
Js objects
anubavam-techkt
 
Prototype 120102020133-phpapp02
plutoone TestTwo
 
JavaScript Survival Guide
Giordano Scalzo
 
JavaScript Essentials
Triphon Statkov
 
Ian 20150116 java script oop
LearningTech
 
Typescript barcelona
Christoffer Noring
 
Java Script Workshop
Dmitry Baranovskiy
 
The many facets of code reuse in JavaScript
Leonardo Borges
 
Oojs 1.1
Rodica Dada
 
OO in JavaScript
Gunjan Kumar
 

More from Stoyan Stefanov (20)

PPTX
YSlow hacking
Stoyan Stefanov
 
PPTX
Liking performance
Stoyan Stefanov
 
PPTX
JavaScript Performance Patterns
Stoyan Stefanov
 
PPTX
JavaScript performance patterns
Stoyan Stefanov
 
PPTX
High Performance Social Plugins
Stoyan Stefanov
 
PDF
Social Button BFFs
Stoyan Stefanov
 
PPTX
JavaScript навсякъде
Stoyan Stefanov
 
PPTX
JavaScript is everywhere
Stoyan Stefanov
 
PDF
JavaScript shell scripting
Stoyan Stefanov
 
PDF
WPO @ PubCon 2010
Stoyan Stefanov
 
PDF
Progressive Downloads and Rendering - take #2
Stoyan Stefanov
 
PDF
Progressive Downloads and Rendering
Stoyan Stefanov
 
PDF
Performance patterns
Stoyan Stefanov
 
PDF
Voices that matter: High Performance Web Sites
Stoyan Stefanov
 
PDF
Psychology of performance
Stoyan Stefanov
 
PPT
3-in-1 YSlow
Stoyan Stefanov
 
PDF
CSS and image optimization
Stoyan Stefanov
 
PPT
High-performance DOM scripting
Stoyan Stefanov
 
PPT
The business of performance
Stoyan Stefanov
 
PDF
JavaScript Patterns
Stoyan Stefanov
 
YSlow hacking
Stoyan Stefanov
 
Liking performance
Stoyan Stefanov
 
JavaScript Performance Patterns
Stoyan Stefanov
 
JavaScript performance patterns
Stoyan Stefanov
 
High Performance Social Plugins
Stoyan Stefanov
 
Social Button BFFs
Stoyan Stefanov
 
JavaScript навсякъде
Stoyan Stefanov
 
JavaScript is everywhere
Stoyan Stefanov
 
JavaScript shell scripting
Stoyan Stefanov
 
WPO @ PubCon 2010
Stoyan Stefanov
 
Progressive Downloads and Rendering - take #2
Stoyan Stefanov
 
Progressive Downloads and Rendering
Stoyan Stefanov
 
Performance patterns
Stoyan Stefanov
 
Voices that matter: High Performance Web Sites
Stoyan Stefanov
 
Psychology of performance
Stoyan Stefanov
 
3-in-1 YSlow
Stoyan Stefanov
 
CSS and image optimization
Stoyan Stefanov
 
High-performance DOM scripting
Stoyan Stefanov
 
The business of performance
Stoyan Stefanov
 
JavaScript Patterns
Stoyan Stefanov
 

Recently uploaded (20)

PDF
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
PPTX
Smart Infrastructure and Automation through IoT Sensors
Rejig Digital
 
PDF
Why Your AI & Cybersecurity Hiring Still Misses the Mark in 2025
Virtual Employee Pvt. Ltd.
 
PDF
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
PDF
Cloud-Migration-Best-Practices-A-Practical-Guide-to-AWS-Azure-and-Google-Clou...
Artjoker Software Development Company
 
PDF
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
REPORT: Heating appliances market in Poland 2024
SPIUG
 
PDF
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
PDF
BLW VOCATIONAL TRAINING SUMMER INTERNSHIP REPORT
codernjn73
 
PDF
Doc9.....................................
SofiaCollazos
 
PDF
The Evolution of KM Roles (Presented at Knowledge Summit Dublin 2025)
Enterprise Knowledge
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PDF
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
SMACT Works
 
PDF
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
 
PDF
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
PDF
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
PPT
L2 Rules of Netiquette in Empowerment technology
Archibal2
 
PDF
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
PDF
DevOps & Developer Experience Summer BBQ
AUGNYC
 
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
Smart Infrastructure and Automation through IoT Sensors
Rejig Digital
 
Why Your AI & Cybersecurity Hiring Still Misses the Mark in 2025
Virtual Employee Pvt. Ltd.
 
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
Cloud-Migration-Best-Practices-A-Practical-Guide-to-AWS-Azure-and-Google-Clou...
Artjoker Software Development Company
 
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
REPORT: Heating appliances market in Poland 2024
SPIUG
 
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
BLW VOCATIONAL TRAINING SUMMER INTERNSHIP REPORT
codernjn73
 
Doc9.....................................
SofiaCollazos
 
The Evolution of KM Roles (Presented at Knowledge Summit Dublin 2025)
Enterprise Knowledge
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
SMACT Works
 
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
 
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
L2 Rules of Netiquette in Empowerment technology
Archibal2
 
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
DevOps & Developer Experience Summer BBQ
AUGNYC
 

Advanced JavaScript

  • 1. Advanced JavaScript: closures, prototypes, inheritance Stoyan Stefanov Ajax Experience, Boston 2008
  • 2. About the presenter Yahoo! performance team member YSlow 2.0 architect, dev Book author, open-source contributor Blog: http:// phpied.com
  • 3. Before we start… Firebug console
  • 4. Firebug console is a learning tool
  • 5. Firebug console… Inspect the contents of objects by clicking on them Tab auto-complete, a.k.a cheatsheet Arrows ↑ and↓ Fiddle with any page
  • 9. JavaScript data types primitive and objects number string boolean undefined null
  • 10. What’s an object? a hash of key => value pairs if a key ( property ) happens to be a function, we can call it a method
  • 11. What’s an object? var obj = { shiny: true , isShiny: function () { return this .shiny; } } ; obj.isShiny(); // true
  • 12. Object literal notation { Wrapped in curly braces } , -delimited properties key : value pairs var obj = {a: 1, &quot;b c d&quot;: 2};
  • 14. Arrays arrays are also objects auto-incremented properties
  • 15. Arrays >>> var a = [1,3,2]; >>> a[0] 1 >>> typeof a &quot;object&quot;
  • 16. Arrays array objects also get some cool properties... >>> a. length 3 ...and methods >>> a. sort () >>> a. join ( ' < ' ) &quot;1 < 2 < 3&quot;
  • 17. Array literal notation var array = [ &quot;Square&quot; , &quot;brackets&quot; , &quot;wrap&quot; , &quot;the&quot; , &quot;comma-delimited&quot; , &quot;elements&quot; ];
  • 18. JSON JavaScript Object Notation Uses object and array literals Quotes required for properties {&quot;num&quot;: 1 , &quot;str&quot;: &quot;abc&quot; , &quot;arr&quot;: [ 1 , 2 , 3 ]}
  • 20. Functions functions are objects they have properties they have methods can de copied, deleted, augmented... special feature: invokable
  • 21. Functions function boo(what) { return what; } or var boo = function (what) { return what; } ;
  • 22. Functions function boo(what) { return what; } or var boo = function bootoo (what) { return what; } ;
  • 23. Functions are objects >>> boo.length 1 >>> boo.name &quot;bootoo&quot;
  • 24. Functions are objects >>> var foo = boo; >>> foo( &quot;doodles&quot; ) &quot;doodles&quot; >>> foo. call ( null , &quot;moo!&quot; ); &quot;moo!&quot;
  • 25. Return value all functions return a value if they don't explicitly, they return undefined implicitly functions can return other functions
  • 27. Constructors when invoked with new , functions return an object known as this you have a chance of modifying this before it's returned you can also return some other object
  • 28. Constructor functions var Person = function (name) { this .name = name; this .speaks = 'fr' ; this .say = function() { return &quot;Je m'appelle &quot; + this .name; }; };
  • 29. An object created with constructor >>> var julien = new Person( &quot;Julien&quot; ); >>> julien.say(); &quot;Je m'appelle Julien&quot;
  • 30. Constructor’s return value var Person = function (){ this .first = &quot;Bruce&quot; ; return {last: &quot;Wayne&quot; }; }; >>> typeof new Person().first &quot;undefined&quot; >>> new Person().last &quot;Wayne&quot;
  • 31. Constructor’s return value var Person = function (){ this .first = &quot;Bruce&quot; ; return &quot;Batman&quot; ; }; >>> new Person().first &quot;Bruce&quot;
  • 32. Naming convention M yConstructor m yFunction
  • 33. constructor property >>> function Person(){}; >>> var jo = new Person(); >>> jo. constructor === Person true
  • 34. constructor property >>> var o = {}; >>> o. constructor === Object true >>> [1,2]. constructor === Array true
  • 35. Built-in constructor functions Object Array Function RegExp Number String Boolean Date Error, SyntaxError, ReferenceError…
  • 36. var fn = new Function( 'a, b','return a+b'); var fn = function(a, b){ return a + b; } var re = new RegExp( '[a-z]', 'gmi'); var re = /[a-z]/gmi; var a = new Array(); var a = []; var o = new Object(); var o = {}; Not that Use this
  • 37. Wrapper objects vs. primitive >>> typeof new Number ( 1 ) &quot;object&quot; >>> typeof 1 &quot;number&quot;
  • 38. Primitives can act as objects >>> &quot;test&quot; . length 4 >>> ( 123.456 ). toFixed ( 2 ) &quot;123.46&quot;
  • 40. prototype a property of the function objects >>> var boo = function (){}; >>> typeof boo. prototype &quot;object&quot;
  • 41. Prototypes can be augmented >>> boo. prototype .a = 1 ; >>> boo. prototype .sayAh = function (){};
  • 42. Prototypes can be overwritten >>> boo. prototype = {a: 1 , b: 2 };
  • 43. How is the prototype used? when a function is invoked as a constructor var Person = function (name) { this .name = name; }; Person. prototype .say = function () { return this .name; }
  • 44. >>> var dude = new Person( 'dude' ); >>> dude.name; &quot;dude&quot; >>> dude.say(); &quot;dude&quot; How is the prototype used?
  • 45. say() is a property of the prototype object but it behaves as if it's a property of the dude object can we tell the difference? How is the prototype used?
  • 46. Own properties vs. prototype’s >>> dude. hasOwnProperty ( 'name' ); true >>> dude. hasOwnProperty ( 'say' ); false
  • 47. isPrototypeOf() >>> Person. prototype . isPrototypeOf (dude); true >>> Object . prototype . isPrototypeOf (dude); true
  • 48. __proto__ I, the dude , have a secret link to the prototype of the constructor that created me __proto__ is not directly exposed in all browsers
  • 49. >>> dude. __proto__ . hasOwnProperty ( 'say' ) true >>> dude. prototype ??? // Trick question >>> dude. __proto__ . __proto__ . hasOwnProperty ( 'toString' ) true __proto__
  • 51. It’s alive! >>> typeof dude.numlegs &quot;undefined&quot; >>> Person. prototype .numlegs = 2 ; >>> dude.numlegs 2
  • 53. Inheritance via the prototype >>> var Dad = function (){ this .family = &quot;Stefanov&quot; ;}; >>> var Kid = function (){}; >>> Kid. prototype = new Dad(); >>> var billy = new Kid(); >>> billy.family &quot;Stefanov&quot;
  • 54. Inherit one more time >>> var GrandKid = function (){}; >>> GrandKid. prototype = billy; >>> var jill = new GrandKid(); >>> jill.family &quot;Stefanov&quot;
  • 55. Inheritance… >>> jill. hasOwnProperty ( 'family' ) false >>> jill. __proto__ . hasOwnProperty ( 'family' ) false >>> jill. __proto__ . __proto__ . hasOwnProperty ( 'family' ) true
  • 56. Inheritance… >>> billy.family = 'Idol' ; >>> jill.family; 'Idol' >>> jill. __proto__ . hasOwnProperty ( 'family' ); true >>> delete billy.family; >>> jill.family; 'Stefanov'
  • 57. Side effect… >>> billy. constructor === Kid false >>> billy. constructor === Dad true
  • 58. Side effect… easy to solve reset after inheritance >>> Kid. prototype . constructor = Kid; >>> GrandKid. prototype . constructor = GrandKid;
  • 59. isPrototypeOf >>> billy. isPrototypeOf (jill) true >>> Kid. prototype . isPrototypeOf (jill) true
  • 60. instanceof >>> jill instanceof GrandKid true >>> jill instanceof Kid true >>> jill instanceof Dad true
  • 61. Classes? There are no classes in JavaScript Objects inherit from objects class ical inheritance is when we think of constructors as if they were classes
  • 62. Classical inheritance function Parent(){ this .name = 'parent' ;} Parent. prototype .getName = function (){ return this .name; }; function Child(){} inherit(Child, Parent);
  • 63. Option 1 function inherit(C, P) { C. prototype = new P(); }
  • 64. Option 2 function inherit(C, P) { C. prototype = P. prototype ; }
  • 65. Option 3 function inherit(C, P) { var F = function (){}; F. prototype = P. prototype ; C. prototype = new F(); }
  • 66. Option 3 + super function inherit(C, P) { var F = function (){}; F. prototype = P. prototype ; C. prototype = new F(); C.uber = P. prototype ; }
  • 67. Option 3 + super + constructor reset function inherit(C, P) { var F = function (){}; F. prototype = P. prototype ; C. prototype = new F(); C.uber = P. prototype ; // super C. prototype . constructor = C; // reset }
  • 68. Inheritance by copying properties After all, inheritance is all about code reuse function extend(parent) { var i, child = {}; for (i in parent) { child[i] = parent[i]; } return child; }
  • 69. Inheritance by copying… >>> var parent = {a: 1 }; >>> var child = extend(parent); >>> child.a 1
  • 70. Inheritance by copying… This was a shallow copy you can make a deep copy using recursion mixins / multiple inheritance
  • 71. Prototypal inheritance as suggested by Douglas Crockford no class-like constructors involved objects inherit from objects via the prototype
  • 72. Prototypal inheritance function object(o) { function F(){} F. prototype = o; return new F(); }
  • 73. Prototypal inheritance >>> var parent = {a: 1 }; >>> var child = object(parent); >>> child.a; 1 >>> child. hasOwnProperty (a); false
  • 74. Scope
  • 75. No block scope >>> if ( true ) { var inside_block = 1 ;} >>> inside_block 1
  • 76. Function scope function boo() { var inboo = true ; }
  • 77. Global namespace every variable is global unless it's in a function and is declared with var global namespace should be kept clean to avoid naming collisions function scope can help
  • 78. Self-executable functions for one-off tasks ( function (){ var a = 1 ; var b = 2 ; alert (a + b); } )()
  • 81.  
  • 82. Closure example #1 function outer(){ var local = 1 ; return function (){ return local; }; }
  • 83. example #1… >>> var inner = outer() >>> inner() 1
  • 84. Closure example #2 var inner; function outer(){ var local = 1 ; inner = function (){ return local; }; }
  • 85. example #2… >>> typeof inner &quot;undefined&quot; >>> outer() >>> inner() 1
  • 86. Closure example #3 function makePlus(arg) { var n = function (){ return arg; }; arg++; return n; }
  • 87. example #3… >>> var getValue = makePlus( 1234 ); >>> getValue() 1235
  • 88. Closure #4 – in a loop function make() { var i, a = []; for (i = 0 ; i < 3 ; i++) { a[i] = function (){ return i; } } return a; }
  • 89. Closure #4 test - oops >>> var funcs = make(); >>> funcs[ 0 ](); 3 >>> funcs[ 1 ](); 3 >>> funcs[ 2 ](); 3
  • 90. Closure #4 – corrected function make() { var i, a = []; for (i = 0 ; i < 3 ; i++) { a[i] = ( function (local){ return function (){ return local;} })(i) } return a; }
  • 91. Getter/Setter var getValue, setValue; ( function () { var secret = 0 ; getValue = function (){ return secret; }; setValue = function (v){ secret = v; }; })() // usage >>> getValue() 0 >>> setValue( 123 ) >>> getValue() 123
  • 92. Iterator function setup(x) { var i = 0 ; return function (){ return x[i++]; }; }
  • 93. Iterator usage >>> var next = setup([ 'a' , 'b' , 'c' ]); >>> next() 'a' >>> next() 'b'
  • 94. Loop through DOM elements - wrong // all elements will alert 5 for (var i = 1; i < 5; i++ ){ document.getElementById('btn'+i).onclick = function(){ alert(i); }; }
  • 95. Loop through DOM elements - correct // first element alerts 1, second 2,... for (var i = 1; i < 5; i++ ){ document.getElementById('btn'+i).onclick = ( function( i ){ return function(){ alert(i); }; } )(i) }
  • 96. Wrapping up… How to tell what’s going on? typeof, instanceof, isPrototypeOf()…
  • 97. >>> typeof variable typeof is an operator, not a function Not typeof(variable) even if it works Returns a string, one of: &quot;string&quot;, &quot;number&quot;, &quot;boolean&quot;, &quot;undefined&quot;, &quot;object&quot;, &quot;function&quot;
  • 98. typeof if ( typeof whatever === &quot;undefined&quot;) { // whatever is not defined } if (whatever == undefined) { // hmm, not so sure }
  • 99. >>> obj instanceof MyConstructor Not instanceof() Returns true | false true for all constructors up the chain
  • 100. >>> obj. constructor Points to the constructor function used to create this obj
  • 101. >>> obj. isPrototypeOf (child_obj) Respects the prototype chain
  • 102. >>> obj. hasOwnProperty ( &quot;prop&quot; ) Own properties vs. properties of the prototype
  • 103. obj. propertyIsEnumerable ( &quot;prop&quot; ) Will it show up in a for-in loop Caution: enumerable properties of the prototype will return false but still show up in the for-in loop
  • 104. Wrapping up… What did we learn today?
  • 105. Objects JavaScript has a few primitive types, everything else is an object Objects are hashes Arrays are objects
  • 106. Functions Functions are objects, only invokable call() and apply() methods prototype property
  • 107. Prototype Functions have a prototype property which is an object Useful with Constructor functions
  • 108. Constructor A function meant to be called with new Returns an object
  • 109. Class No such thing in JavaScript
  • 110. Inheritance Prototypal Class ical … and approximately 101 other ways and variations
  • 112. Closure When a variable leaves its function scope
  • 113. Thank you! Stoyan Stefanov http://www.phpied.com