SlideShare a Scribd company logo
JS Level Up: Prototypes Take your JavaScript to the next level
JavaScript has a very
simple type system
http://bit.ly/1QZ4QVX
JavaScript has a very
simple type system
http://bit.ly/1QZ4QVX
1. Primitive Types
2. Object Types
Primitive Types
http://bit.ly/1QZ4QVX
1. String
2. Number
3. Boolean
4. Undefined
5. Null
Object Types
http://bit.ly/1QZ4QVX
1. Object
2. Array
3. Function
* Some like to say everything is an object
Everything in JavaScript can act like an object
Every object in JavaScript links to a prototype object
console.log( “”.__proto__ === String.prototype ); // true!
That, if you’re wondering, is
pronounced “dunder proto"
Constructor Functions leverage this link

to create reusable interfaces (not UI)
Constructor Functions
• Constructor functions are used
to create new objects. 

• Very useful when creating
multiple instances of a
particular object
var list = new Array( 1, 2, 3 );
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
var list = new Array( 1, 2, 3 );
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
Where did
that push
method
come from?
var list = new Array( 1, 2, 3 );
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
Where did
that push
method
come from?
It’s inherited from Array.prototype!
var list = new Array( 1, 2,
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
new Array( 1, 2, 3 )
var list = new Array( 1, 2,
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
new Array( 1, 2, 3 )
A function is a block of code that is defined

once but can be invoked any number of times.
var list = new Array( 1, 2,
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
new Array( 1, 2, 3 )
Each function has a special this

keyword, the functions invocation context
var list = new Array( 1, 2,
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
new Array( 1, 2, 3 )
Functions used to initialize a new

object are called Constructor Functions
var list = new Array( 1, 2,
list.push( 4 );
// list === [ 1, 2, 3, 4 ]
new Array( 1, 2, 3 )
All functions - because they are objects - have

a prototype property that is a link to the prototype object
So let’s look at an example
function Person ( name ) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log( “Hi! I’m “, this.name );
}
var vernon = new Person( “Vernon” );
vernon.sayHi(); // Hi! I’m Vernon
Constructor Functions
function Person ( name ) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log( “Hi! I’m “, this.name );
}
var vernon = new Person( “Vernon” );
vernon.sayHi(); // Hi! I’m Vernon
• Common convention is to
uppercase the first character of
the function name of a
constructor function

• The context of this within the
constructor function is the
newly created object

• No return statement required
Constructor Functions
function Person ( name ) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log( “Hi! I’m “, this.name );
}
var vernon = new Person( “Vernon” );
vernon.sayHi(); // Hi! I’m Vernon
• We can add custom
functionality to the prototype
object of our function

• This added functionality is
inherited by each instance of
our constructor we create

• The context of methods added
to the prototype object are the
created instance itself
Constructor Functions
function Person ( name ) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log( “Hi! I’m “, this.name );
}
var vernon = new Person( “Vernon” );
vernon.sayHi(); // Hi! I’m Vernon
• A new object instance is
created by invoking a
constructor function with the
new operator

• Here, we create vernon and
assign is the specified values
as its properties

• So, the value of vernon.name
would be “Vernon”

• We can now create as many
“Person’s” as we want, and
they will all be able to sayHi!
Constructor Functions
function Person ( name ) {
this.name = name; // this === window
}
Person.prototype.sayHi = function () {
console.log( “Hi! I’m “, this.name );
}
var vernon = Person( “Vernon” );
vernon.sayHi(); // Hi! I’m Vernon
• Invoking a constructor function
without the new operator has
unintended side effects

• The context of the newly
created object in the case of a
missing new, is window
Constructor Functions
function Person ( name ) {
if ( !( this instanceof Person ) ) {
return new Person( name );
}
this.name = name;
}
Person.prototype.sayHi = function () {
console.log( “Hi! I’m “, this.name );
}
var vernon = new Person( “Vernon” );
vernon.sayHi(); // Hi! I’m Vernon
• We can protect ourselves from
these side effects by using the
instanceof operator

• instanceof tests whether an
object has the prototype
property of a constructor in its
prototype chain

• Here, we test the context of
our constructor and return the
proper invocation if needed
function Person ( name ) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log( “Hi! I’m “, this.name );
}
var vernon = new Person( “Vernon” );
vernon.sayHi(); // Hi! I’m Vernon
Person.prototype.sayBye = function () {
console.log( “Bye!” );
}
vernon.sayBye(); // Bye!
function Person ( name ) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log(
}
var vernon = new Person(
vernon.sayHi(); // Hi! I’m Vernon
Person
console
}
vernon
Prototypal Inheritance
Prototypal Inheritance
• All inheritance in JavaScript is
through the prototype object

• Object.prototype does not
inherit any properties

• All built-in constructors inherit
from Object.prototype
• Best understood by looking at
an example
http://bit.ly/1MNdeGU
Creates a new object with the specified prototype object and properties
Prototypal Inheritance | Object.create()
var obj = {}; // Inherits from Object.prototype
obj.foo = "bar"; // has an own property of foo
var obj2 = Object.create( obj ); // Inherits from obj and Object.prototype
obj2.bar = "baz"; // has an own property of bar
var obj3 = Object.create( obj2 ); // Inherits from obj, obj2 and Object.prototype
obj3.baz = "thud"; // has an own property of baz
console.log( obj3.foo ); // bar
console.log( obj3.bar ); // baz
console.log( obj3.hasOwnProperty( “foo” ) ); // false
var obj = {}; // Inherits from Object.prototype
obj.foo = "bar"; // has an own property of foo
var obj2 = Object.create
obj2.bar = "baz"; // has an own property of bar
var obj3 = Object.create
obj3.baz = "thud"; // has an own property of baz
console.log( obj3.foo ); // bar
console.log( obj3.bar ); // baz
console.log( obj3.hasOwnProperty(
This inheritance lookup is 

done against the prototype chain
Prototypal Inheritance
var obj = {}; // Inherits from Object.prototype
obj.foo = "bar"; // has an own property of foo
var obj2 = Object.create
obj2.bar = "baz"; // has an own property of bar
var obj3 = Object.create
obj3.baz = "thud"; // has an own property of baz
console.log( obj3.foo ); // bar
console.log( obj3.bar ); // baz
console.log( obj3.hasOwnProperty(
We can leverage this to
create scalable objects
Prototypal Inheritance
var obj = {}; // Inherits from Object.prototype
obj.foo = "bar"; // has an own property of foo
var obj2 = Object.create
obj2.bar = "baz"; // has an own property of bar
var obj3 = Object.create
obj3.baz = "thud"; // has an own property of baz
console.log( obj3.foo ); // bar
console.log( obj3.bar ); // baz
console.log( obj3.hasOwnProperty(
Let’s look at 

another example
Prototypal Inheritance
var User = function( details ) {
details = details || {};
this.firstname = details.firstname;
this.lastname = details.lastname;
};
Let’s create a User constructor function
var User = function( details ) {
details = details || {};
this.firstname = details.firstname;
this.lastname = details.lastname;
};
User.prototype.logName = function() {
console.log( this.firstname + " " + this.lastname );
};
Now, we’ll add a logName method to the prototype
var User = function( details ) {
details = details || {};
this.firstname = details.firstname;
this.lastname = details.lastname;
};
User.prototype.logName = function() {
console.log( this.firstname + " " + this.lastname );
};
var john = new User( { firstname: "John", lastname: "Doe" } );
Finally, let’s create an instance of a User
var User = function( details ) { … };
User.prototype.logName = function() { … };
var john = new User( { firstname: "John", lastname: "Doe" } );
var Admin = function( details ) {
this.firstname = details.firstname;
this.lastname = details.lastname;
this.fullaccess = true;
};
Now, let’s add an Admin constructor function
var User = function( details ) { … };
User.prototype.logName = function() { … };
var john = new User( { firstname: "John", lastname: "Doe" } );
var Admin = function( details ) {
this.firstname = details.firstname;
this.lastname = details.lastname;
this.fullaccess = true;
};
Admin.prototype = new User();
Admin.prototype.constructor = Admin;
We can inherit functionality from our User function
var User = function( details ) { … };
User.prototype.logName = function() { … };
var john = new User( { firstname: "John", lastname: "Doe" } );
var Admin = function( details ) {
this.firstname = details.firstname;
this.lastname = details.lastname;
this.fullaccess = true;
};
Admin.prototype = new User();
Admin.prototype.constructor = Admin;
var jane = new Admin( { firstname: "Jane", lastname: "Doe" } );
jane.logName(); // Jane Doe
Our new Admin instance has access to logName
Inheritance and 

the prototype chain
• ECMAScript 6 introduces a
new set of keywords
implementing “classes” in
JavaScript. It’s important to
note that these classes are still
prototype based.

• Object.create is another
method of inheritance

• Do not extend native
prototypes unless you are back
porting newer features of
JavaScript to older engines
http://bit.ly/1MNdeGU
Thanks for listening! @vernonk

More Related Content

What's hot (20)

PPTX
Javascript Common Design Patterns
Pham Huy Tung
 
PPT
Advanced Javascript
Adieu
 
PDF
Elegant Solutions For Everyday Python Problems - Nina Zakharenko
Nina Zakharenko
 
KEY
A tour on ruby and friends
旻琦 潘
 
PPT
Object Oriented JavaScript
Donald Sipe
 
PPTX
Letusgo 2019 Summer - StringInterpolation and SwiftUI
정민 안
 
PDF
A Few of My Favorite (Python) Things
Michael Pirnat
 
PDF
Introduction to clojure
Abbas Raza
 
PDF
Object Oriented JavaScript
Michael Girouard
 
PDF
Swift와 Objective-C를 함께 쓰는 방법
Jung Kim
 
PPT
Advanced JavaScript
Stoyan Stefanov
 
PPTX
ES6: Features + Rails
Santosh Wadghule
 
PDF
Stubる - Mockingjayを使ったHTTPクライアントのテスト -
Kenji Tanaka
 
PPSX
Symfony2 meets propel 1.5
Francois Zaninotto
 
PDF
Nick Sieger JRuby Concurrency EMRubyConf 2011
Nick Sieger
 
PDF
Big Data Day LA 2015 - Mongoose v/s Waterline: Battle of the ORM by Tim Fulme...
Data Con LA
 
PDF
Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...
Puppet
 
PPTX
Understanding Object Oriented Javascript - Coffee@DBG June
Deepu S Nath
 
PDF
Aplicações assíncronas no Android com
Coroutines & Jetpack
Nelson Glauber Leal
 
Javascript Common Design Patterns
Pham Huy Tung
 
Advanced Javascript
Adieu
 
Elegant Solutions For Everyday Python Problems - Nina Zakharenko
Nina Zakharenko
 
A tour on ruby and friends
旻琦 潘
 
Object Oriented JavaScript
Donald Sipe
 
Letusgo 2019 Summer - StringInterpolation and SwiftUI
정민 안
 
A Few of My Favorite (Python) Things
Michael Pirnat
 
Introduction to clojure
Abbas Raza
 
Object Oriented JavaScript
Michael Girouard
 
Swift와 Objective-C를 함께 쓰는 방법
Jung Kim
 
Advanced JavaScript
Stoyan Stefanov
 
ES6: Features + Rails
Santosh Wadghule
 
Stubる - Mockingjayを使ったHTTPクライアントのテスト -
Kenji Tanaka
 
Symfony2 meets propel 1.5
Francois Zaninotto
 
Nick Sieger JRuby Concurrency EMRubyConf 2011
Nick Sieger
 
Big Data Day LA 2015 - Mongoose v/s Waterline: Battle of the ORM by Tim Fulme...
Data Con LA
 
Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...
Puppet
 
Understanding Object Oriented Javascript - Coffee@DBG June
Deepu S Nath
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Nelson Glauber Leal
 

Viewers also liked (8)

PDF
Using Node and Grunt to create an awesome workflow
Vernon Kesner
 
PDF
Design Systems are Coming... Are you Ready?
Vernon Kesner
 
PDF
Modular Development with RequireJS
Vernon Kesner
 
PDF
Modern UI Development With Node.js
Ryan Anklam
 
PDF
Learn BEM: CSS Naming Convention
In a Rocket
 
PDF
SEO: Getting Personal
Kirsty Hulse
 
PDF
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
ux singapore
 
PDF
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Stanford GSB Corporate Governance Research Initiative
 
Using Node and Grunt to create an awesome workflow
Vernon Kesner
 
Design Systems are Coming... Are you Ready?
Vernon Kesner
 
Modular Development with RequireJS
Vernon Kesner
 
Modern UI Development With Node.js
Ryan Anklam
 
Learn BEM: CSS Naming Convention
In a Rocket
 
SEO: Getting Personal
Kirsty Hulse
 
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
ux singapore
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Stanford GSB Corporate Governance Research Initiative
 
Ad

Similar to JS Level Up: Prototypes (20)

PPT
Advanced Javascript
relay12
 
PPT
Advanced Javascript
Manikanda kumar
 
PPT
JavaScript In Object Oriented Way
Borey Lim
 
PDF
Prototype 120102020133-phpapp02
plutoone TestTwo
 
PDF
JavaScript Essentials
Triphon Statkov
 
PPTX
Ajaxworld
deannalagason
 
PPTX
Oojs 1.1
Rodica Dada
 
PDF
Prototype
Aditya Gaur
 
PDF
JavaScript Inheritance
Jussi Pohjolainen
 
KEY
2012 oct-12 - java script inheritance
pedro.carvalho
 
PPTX
Javascript Prototypal Inheritance - Big Picture
Manish Jangir
 
PPTX
Javascript Prototype Visualized
军 沈
 
PPTX
WEB222-lecture-4.pptx
RohitSharma318779
 
PPT
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 
PPT
Javascript Object Oriented Programming
Bunlong Van
 
PDF
The prototype property
Hernan Mammana
 
PPTX
Function-and-prototype defined classes in JavaScript
Hong Langford
 
PDF
JavaScript Core
François Sarradin
 
PPTX
Prototype & Inheritance in JavaScript
Sunny Sharma
 
PDF
Object Oriented Programming in JavaScript
zand3rs
 
Advanced Javascript
relay12
 
Advanced Javascript
Manikanda kumar
 
JavaScript In Object Oriented Way
Borey Lim
 
Prototype 120102020133-phpapp02
plutoone TestTwo
 
JavaScript Essentials
Triphon Statkov
 
Ajaxworld
deannalagason
 
Oojs 1.1
Rodica Dada
 
Prototype
Aditya Gaur
 
JavaScript Inheritance
Jussi Pohjolainen
 
2012 oct-12 - java script inheritance
pedro.carvalho
 
Javascript Prototypal Inheritance - Big Picture
Manish Jangir
 
Javascript Prototype Visualized
军 沈
 
WEB222-lecture-4.pptx
RohitSharma318779
 
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 
Javascript Object Oriented Programming
Bunlong Van
 
The prototype property
Hernan Mammana
 
Function-and-prototype defined classes in JavaScript
Hong Langford
 
JavaScript Core
François Sarradin
 
Prototype & Inheritance in JavaScript
Sunny Sharma
 
Object Oriented Programming in JavaScript
zand3rs
 
Ad

Recently uploaded (20)

PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PPTX
Designing Production-Ready AI Agents
Kunal Rai
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Designing Production-Ready AI Agents
Kunal Rai
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 

JS Level Up: Prototypes

  • 1. JS Level Up: Prototypes Take your JavaScript to the next level
  • 2. JavaScript has a very simple type system http://bit.ly/1QZ4QVX
  • 3. JavaScript has a very simple type system http://bit.ly/1QZ4QVX 1. Primitive Types 2. Object Types
  • 6. * Some like to say everything is an object Everything in JavaScript can act like an object
  • 7. Every object in JavaScript links to a prototype object console.log( “”.__proto__ === String.prototype ); // true! That, if you’re wondering, is pronounced “dunder proto"
  • 8. Constructor Functions leverage this link
 to create reusable interfaces (not UI)
  • 9. Constructor Functions • Constructor functions are used to create new objects. • Very useful when creating multiple instances of a particular object var list = new Array( 1, 2, 3 ); list.push( 4 ); // list === [ 1, 2, 3, 4 ]
  • 10. var list = new Array( 1, 2, 3 ); list.push( 4 ); // list === [ 1, 2, 3, 4 ] Where did that push method come from?
  • 11. var list = new Array( 1, 2, 3 ); list.push( 4 ); // list === [ 1, 2, 3, 4 ] Where did that push method come from? It’s inherited from Array.prototype!
  • 12. var list = new Array( 1, 2, list.push( 4 ); // list === [ 1, 2, 3, 4 ] new Array( 1, 2, 3 )
  • 13. var list = new Array( 1, 2, list.push( 4 ); // list === [ 1, 2, 3, 4 ] new Array( 1, 2, 3 ) A function is a block of code that is defined
 once but can be invoked any number of times.
  • 14. var list = new Array( 1, 2, list.push( 4 ); // list === [ 1, 2, 3, 4 ] new Array( 1, 2, 3 ) Each function has a special this
 keyword, the functions invocation context
  • 15. var list = new Array( 1, 2, list.push( 4 ); // list === [ 1, 2, 3, 4 ] new Array( 1, 2, 3 ) Functions used to initialize a new
 object are called Constructor Functions
  • 16. var list = new Array( 1, 2, list.push( 4 ); // list === [ 1, 2, 3, 4 ] new Array( 1, 2, 3 ) All functions - because they are objects - have
 a prototype property that is a link to the prototype object
  • 17. So let’s look at an example function Person ( name ) { this.name = name; } Person.prototype.sayHi = function () { console.log( “Hi! I’m “, this.name ); } var vernon = new Person( “Vernon” ); vernon.sayHi(); // Hi! I’m Vernon
  • 18. Constructor Functions function Person ( name ) { this.name = name; } Person.prototype.sayHi = function () { console.log( “Hi! I’m “, this.name ); } var vernon = new Person( “Vernon” ); vernon.sayHi(); // Hi! I’m Vernon • Common convention is to uppercase the first character of the function name of a constructor function • The context of this within the constructor function is the newly created object • No return statement required
  • 19. Constructor Functions function Person ( name ) { this.name = name; } Person.prototype.sayHi = function () { console.log( “Hi! I’m “, this.name ); } var vernon = new Person( “Vernon” ); vernon.sayHi(); // Hi! I’m Vernon • We can add custom functionality to the prototype object of our function • This added functionality is inherited by each instance of our constructor we create • The context of methods added to the prototype object are the created instance itself
  • 20. Constructor Functions function Person ( name ) { this.name = name; } Person.prototype.sayHi = function () { console.log( “Hi! I’m “, this.name ); } var vernon = new Person( “Vernon” ); vernon.sayHi(); // Hi! I’m Vernon • A new object instance is created by invoking a constructor function with the new operator • Here, we create vernon and assign is the specified values as its properties • So, the value of vernon.name would be “Vernon” • We can now create as many “Person’s” as we want, and they will all be able to sayHi!
  • 21. Constructor Functions function Person ( name ) { this.name = name; // this === window } Person.prototype.sayHi = function () { console.log( “Hi! I’m “, this.name ); } var vernon = Person( “Vernon” ); vernon.sayHi(); // Hi! I’m Vernon • Invoking a constructor function without the new operator has unintended side effects • The context of the newly created object in the case of a missing new, is window
  • 22. Constructor Functions function Person ( name ) { if ( !( this instanceof Person ) ) { return new Person( name ); } this.name = name; } Person.prototype.sayHi = function () { console.log( “Hi! I’m “, this.name ); } var vernon = new Person( “Vernon” ); vernon.sayHi(); // Hi! I’m Vernon • We can protect ourselves from these side effects by using the instanceof operator • instanceof tests whether an object has the prototype property of a constructor in its prototype chain • Here, we test the context of our constructor and return the proper invocation if needed
  • 23. function Person ( name ) { this.name = name; } Person.prototype.sayHi = function () { console.log( “Hi! I’m “, this.name ); } var vernon = new Person( “Vernon” ); vernon.sayHi(); // Hi! I’m Vernon Person.prototype.sayBye = function () { console.log( “Bye!” ); } vernon.sayBye(); // Bye!
  • 24. function Person ( name ) { this.name = name; } Person.prototype.sayHi = function () { console.log( } var vernon = new Person( vernon.sayHi(); // Hi! I’m Vernon Person console } vernon Prototypal Inheritance
  • 25. Prototypal Inheritance • All inheritance in JavaScript is through the prototype object • Object.prototype does not inherit any properties • All built-in constructors inherit from Object.prototype • Best understood by looking at an example http://bit.ly/1MNdeGU
  • 26. Creates a new object with the specified prototype object and properties Prototypal Inheritance | Object.create() var obj = {}; // Inherits from Object.prototype obj.foo = "bar"; // has an own property of foo var obj2 = Object.create( obj ); // Inherits from obj and Object.prototype obj2.bar = "baz"; // has an own property of bar var obj3 = Object.create( obj2 ); // Inherits from obj, obj2 and Object.prototype obj3.baz = "thud"; // has an own property of baz console.log( obj3.foo ); // bar console.log( obj3.bar ); // baz console.log( obj3.hasOwnProperty( “foo” ) ); // false
  • 27. var obj = {}; // Inherits from Object.prototype obj.foo = "bar"; // has an own property of foo var obj2 = Object.create obj2.bar = "baz"; // has an own property of bar var obj3 = Object.create obj3.baz = "thud"; // has an own property of baz console.log( obj3.foo ); // bar console.log( obj3.bar ); // baz console.log( obj3.hasOwnProperty( This inheritance lookup is 
 done against the prototype chain Prototypal Inheritance
  • 28. var obj = {}; // Inherits from Object.prototype obj.foo = "bar"; // has an own property of foo var obj2 = Object.create obj2.bar = "baz"; // has an own property of bar var obj3 = Object.create obj3.baz = "thud"; // has an own property of baz console.log( obj3.foo ); // bar console.log( obj3.bar ); // baz console.log( obj3.hasOwnProperty( We can leverage this to create scalable objects Prototypal Inheritance
  • 29. var obj = {}; // Inherits from Object.prototype obj.foo = "bar"; // has an own property of foo var obj2 = Object.create obj2.bar = "baz"; // has an own property of bar var obj3 = Object.create obj3.baz = "thud"; // has an own property of baz console.log( obj3.foo ); // bar console.log( obj3.bar ); // baz console.log( obj3.hasOwnProperty( Let’s look at 
 another example Prototypal Inheritance
  • 30. var User = function( details ) { details = details || {}; this.firstname = details.firstname; this.lastname = details.lastname; }; Let’s create a User constructor function
  • 31. var User = function( details ) { details = details || {}; this.firstname = details.firstname; this.lastname = details.lastname; }; User.prototype.logName = function() { console.log( this.firstname + " " + this.lastname ); }; Now, we’ll add a logName method to the prototype
  • 32. var User = function( details ) { details = details || {}; this.firstname = details.firstname; this.lastname = details.lastname; }; User.prototype.logName = function() { console.log( this.firstname + " " + this.lastname ); }; var john = new User( { firstname: "John", lastname: "Doe" } ); Finally, let’s create an instance of a User
  • 33. var User = function( details ) { … }; User.prototype.logName = function() { … }; var john = new User( { firstname: "John", lastname: "Doe" } ); var Admin = function( details ) { this.firstname = details.firstname; this.lastname = details.lastname; this.fullaccess = true; }; Now, let’s add an Admin constructor function
  • 34. var User = function( details ) { … }; User.prototype.logName = function() { … }; var john = new User( { firstname: "John", lastname: "Doe" } ); var Admin = function( details ) { this.firstname = details.firstname; this.lastname = details.lastname; this.fullaccess = true; }; Admin.prototype = new User(); Admin.prototype.constructor = Admin; We can inherit functionality from our User function
  • 35. var User = function( details ) { … }; User.prototype.logName = function() { … }; var john = new User( { firstname: "John", lastname: "Doe" } ); var Admin = function( details ) { this.firstname = details.firstname; this.lastname = details.lastname; this.fullaccess = true; }; Admin.prototype = new User(); Admin.prototype.constructor = Admin; var jane = new Admin( { firstname: "Jane", lastname: "Doe" } ); jane.logName(); // Jane Doe Our new Admin instance has access to logName
  • 36. Inheritance and 
 the prototype chain • ECMAScript 6 introduces a new set of keywords implementing “classes” in JavaScript. It’s important to note that these classes are still prototype based. • Object.create is another method of inheritance • Do not extend native prototypes unless you are back porting newer features of JavaScript to older engines http://bit.ly/1MNdeGU