SlideShare a Scribd company logo
Object-oriented 
Javascript 
Daniel Ku (http://kjunine.net/)
Primitives and 
Objects
“Is Everything 
in JavaScript 
an object?”
WRONG!
Primitives 
» string 
» number 
» boolean 
» undefined 
» null 
Everything else is object.
“WHAT? 
Strings have 
properties and methods!”
var p = 'hello'; 
p.test = 'test'; 
console.log(p.test); // ? 
var o = new String('hello'); 
o.test = 'test'; 
console.log(o.test); // ?
var p = 'hello'; 
p.test = 'test'; 
console.log(p.test); // undefined 
var o = new String('hello'); 
o.test = 'test'; 
console.log(o.test); // test
typeof 'hello'; // string 
typeof new String('hello'); // object 
typeof 10 // number 
typeof new Number(10); // object 
typeof false; // boolean 
typeof new Boolean(true); // object 
typeof undefined; // undefined 
typeof null; // object ???
HOW 
to create an object?
Factory Functions
var createPerson = function(firstName, lastName) { 
return { 
firstName: firstName, 
lastName: lastName, 
sayHi: function() { 
return 'Hi there'; 
} 
}; 
}; 
var john = createPerson('John', 'Doe'); 
var jane = createPerson('Jane', 'Doe');
IT WORKS! BUT, 
BAD PRACTICE!
The this keyword
this 
is 
» window in global context 
» the object in an object
var name = 'Jane'; 
var greet = function() { 
return 'My name is ' + this.name; 
} 
var person = { 
name: 'John', 
greet: greet 
}; 
greet(); // ? 
person.greet(); // ?
var name = 'Jane'; 
var greet = function() { 
return 'My name is ' + this.name; 
} 
var person = { 
name: 'John', 
greet: greet 
}; 
greet(); // My name is Jane 
person.greet(); // My name is John
var requestAsync = function(url, callback) { 
var data = 10; 
callback(data); 
}; 
var requestor = { 
value: 20, 
process: function(data) { 
var sum = this.value + data; 
console.log(sum); 
}, 
request: function() { 
var url = 'http://example.com'; 
requestAsync(url, this.process); 
} 
}; 
requestor.request(); // ?
var requestAsync = function(url, callback) { 
var data = 10; 
callback(data); 
}; 
var requestor = { 
value: 20, 
process: function(data) { 
var sum = this.value + data; 
console.log(sum); 
}, 
request: function() { 
var url = 'http://example.com'; 
requestAsync(url, this.process); 
} 
}; 
requestor.request(); // NaN
Function.prototype.bind 
» reference 
» es5-shim
var requestAsync = function(url, callback) { 
var data = 10; 
callback(data); 
}; 
var requestor = { 
value: 20, 
process: function(data) { 
var sum = this.value + data; 
console.log(sum); 
}, 
request: function() { 
var url = 'http://example.com'; 
requestAsync(url, this.process.bind(this)); 
} 
}; 
requestor.request(); // 30
Constructor 
Functions
var Person = function(firstName, lastName) { 
this.firstName = firstName; 
this.lastName = lastName; 
this.sayHi = function() { 
return 'Hi~'; 
}; 
}; 
var person = new Person('John', 'Doe');
Also, 
BAD PRACTICE! 
Do like next.
var Person = function(firstName, lastName) { 
this.firstName = firstName; 
this.lastName = lastName; 
}; 
Person.prototype.sayHi = function() { 
return 'Hi~'; 
}; 
var person = new Person('John', 'Doe');
The Prototype
Object-oriented Javascript
Object-oriented Javascript
Object.getPrototypeOf 
» reference 
» es5-shim
person.constructor === Person; // true 
person.__proto__ === Person.prototype; // true 
Object.getPrototypeOf(person) 
=== Person.prototype; // true
person.hasOwnProperty('firstName'); // true 
person.hasOwnProperty('lastName'); // true 
person.hasOwnProperty('sayHi'); // false 
person.constructor 
.prototype 
.hasOwnProperty('sayHi'); // true
Properties and 
Property 
Descriptors
var person = {}; 
Object.defineProperty(person, 'firstName', { 
// descriptor object (data descriptor) 
value: 'John', 
writable: true 
}); 
Object.defineProperty(person, 'lastName', { 
value: 'Doe', 
writable: false 
}); 
person.firstName; // 'John' 
person.lastName; // 'Doe'
person.firstName = 'Jane'; 
person.firstName; // 'Jane' 
person.lastName = 'Dummy'; 
person.lastName; // 'Doe'
var person = {}; 
Object.defineProperties(person, { 
firstName: { 
value: 'John', 
writable: true 
}, 
lastName: { 
value: 'Doe', 
writable: true 
}, 
fullName: { 
// accessor descriptor 
get: function() { 
return this.firstName + ' ' + this.lastName; 
}, 
set: function(value) { 
var splits = value.split(' '); 
this.firstName = splits[0]; 
this.lastName = splits[1]; 
} 
} 
});
person.fullName; // 'John Doe' 
person.fullName = 'Jane Eyre' 
person.firstName; // 'Jane' 
person.lastName; // 'Eyre' 
person.fullName; // 'Jane Eyre'
var person = {}; 
Object.defineProperty(person, 'firstName', { 
value: 'John', 
enumerable: true 
}); 
Object.defineProperty(person, 'lastName', { 
value: 'Doe', 
enumerable: false 
}); 
for (var key in person) { 
console.log(key, '=>' , person[key]); 
} 
// 'firstName => John'
Object.defineProperty 
» Property Descriptors 
» Data Descriptors 
» Accessor Descriptors 
» reference 
» es5-shim
Common Keys of Descriptors 
» configurable (default: false) 
» enumerable (default: false)
Keys of Data Descriptors 
» value (default: undefined) 
» writable (default: false)
Keys of Accessor Descriptors 
» get (default: undefined) 
» set (default: undefined)
Constructors and 
the Prototype 
REVISITED
var Person = function(firstName, lastName) { 
Object.defineProperty(this, 'firstName', { 
value: firstName, 
writable: true, 
enumerable: true 
}); 
Object.defineProperty(this, 'lastName', { 
value: lastName, 
writable: true, 
enumerable: true 
}); 
};
Object.defineProperties(Person.prototype, { 
sayHi: { 
value: function() { 
return 'Hi there'; 
} 
}, 
fullName: { 
get: function() { 
return this.firstName + ' ' + this.lastName; 
}, 
enumerable: true 
} 
}); 
var person = new Person('John', 'Doe');
HOW 
to do inheritance?
Prototypical Inheritance
Object.create 
» reference 
» es5-shim
var person = { 
firstName: 'John', 
lastName: 'Doe' 
}; 
var employee = Object.create(person); 
Object.getPrototypeOf(employee) === person; // true
Object.getOwnPropertyDescriptor 
» reference 
» es5-shim
var Person = function(firstName, lastName) { 
this.firstName = firstName; 
this.lastName = lastName; 
}; 
Person.prototype.sayHi = function() { 
return 'Hi~'; 
}; 
var person = new Person('John', 'Doe'); 
Object.getOwnPropertyDescriptor(Person.prototype, 'sayHi'); 
// {value: function, writable: true, enumerable: true, configurable: true} 
Object.getOwnPropertyDescriptor(person, 'firstName'); 
// {value: "John", writable: true, enumerable: true, configurable: true}
Let's Do Inheritance
var Person = function(firstName, lastName) { 
Object.defineProperties(this, { 
firstName: { 
value: firstName, 
writable: true, 
enumerable: true 
}, 
lastName: { 
value: lastName, 
writable: true, 
enumerable: true 
} 
}); 
}; 
Object.defineProperties(Person.prototype, { 
sayHi: { 
value: function() { 
return 'Hi there'; 
} 
}, 
fullName: { 
get: function() { 
return this.firstName + ' ' + this.lastName; 
}, 
enumerable: true 
} 
});
var Employee = function(firstName, lastName, position) { 
Person.call(this, firstName, lastName); 
Object.defineProperties(this, { 
position: { 
value: position, 
writable: true, 
enumerable: true 
} 
}); 
};
Employee.prototype = Object.create(Person.prototype, { 
sayHi: { 
value: function() { 
return Person.prototype.sayHi.call(this) + ' and here'; 
} 
}, 
fullName: { 
get: function() { 
var descriptor = Object.getOwnPropertyDescriptor(Person.prototype, 'fullName'); 
return descriptor.get.call(this) + ' ' + this.position; 
}, 
enumerable: true 
}, 
constructor: { 
value: Employee 
} 
});
var employee = new Employee('John', 'Doe', 'Manager'); 
for (var key in employee) { 
console.log(key, '=>' , employee[key]); 
} 
// 'firstName => John' 
// 'lastName => Doe' 
// 'position => Manager' 
// 'fullName => John Doe Manager'
Prototypical 
Inheritance
Object-oriented Javascript
Object.getPrototypeOf(employee) === Employee.prototype; // true 
employee.__proto__ === Employee.prototype; // true 
employee.__proto__.__proto__ === Person.prototype; // true 
employee.__proto__.__proto__.__proto__ === Object.prototype; // true 
employee.__proto__.__proto__.__proto__.__proto__ === null; // true
References 
» Object-Oriented JavaScript on Tuts+ 
» Inheritance revisited on MDN 
» ECMA-262-5 in detail by Dmitry Soshnikov
THE END

More Related Content

PDF
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
PDF
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
PDF
You code sucks, let's fix it
PPTX
Presentation1
PDF
Your code sucks, let's fix it
PDF
Your code sucks, let's fix it - DPC UnCon
KEY
Object Calisthenics Applied to PHP
DOC
Jsphp 110312161301-phpapp02
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
You code sucks, let's fix it
Presentation1
Your code sucks, let's fix it
Your code sucks, let's fix it - DPC UnCon
Object Calisthenics Applied to PHP
Jsphp 110312161301-phpapp02

What's hot (19)

PDF
Mocking Demystified
PDF
PHP for Adults: Clean Code and Object Calisthenics
PDF
Object Calisthenics Adapted for PHP
PDF
Xlab #1: Advantages of functional programming in Java 8
PPTX
Adding Dependency Injection to Legacy Applications
KEY
Symfony2 Building on Alpha / Beta technology
PDF
PHPUnit でよりよくテストを書くために
PDF
The History of PHPersistence
PDF
SfCon: Test Driven Development
PDF
Command Bus To Awesome Town
PDF
Min-Maxing Software Costs
PDF
Database Design Patterns
ODP
PHPUnit elevato alla Symfony2
PDF
Models and Service Layers, Hemoglobin and Hobgoblins
PPTX
Hacking Your Way To Better Security - Dutch PHP Conference 2016
PDF
Migrating to dependency injection
PDF
Things I Believe Now That I'm Old
PDF
Functional Structures in PHP
PDF
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mocking Demystified
PHP for Adults: Clean Code and Object Calisthenics
Object Calisthenics Adapted for PHP
Xlab #1: Advantages of functional programming in Java 8
Adding Dependency Injection to Legacy Applications
Symfony2 Building on Alpha / Beta technology
PHPUnit でよりよくテストを書くために
The History of PHPersistence
SfCon: Test Driven Development
Command Bus To Awesome Town
Min-Maxing Software Costs
Database Design Patterns
PHPUnit elevato alla Symfony2
Models and Service Layers, Hemoglobin and Hobgoblins
Hacking Your Way To Better Security - Dutch PHP Conference 2016
Migrating to dependency injection
Things I Believe Now That I'm Old
Functional Structures in PHP
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Ad

Viewers also liked (7)

PDF
Deploying an application with Chef and Docker
PDF
Google Analytics
PDF
MeaNstack on Docker
PDF
Getting Started with Redis
PDF
Indices APIs - Elasticsearch Reference
PDF
Utilizing Bluebird Promises
PDF
Promise and Bluebird
Deploying an application with Chef and Docker
Google Analytics
MeaNstack on Docker
Getting Started with Redis
Indices APIs - Elasticsearch Reference
Utilizing Bluebird Promises
Promise and Bluebird
Ad

Similar to Object-oriented Javascript (20)

PDF
Intro to Advanced JavaScript
PPTX
Everyday's JS
PPT
Web Optimization Summit: Coding for Performance
PDF
JavaScript for PHP developers
PDF
04 Advanced Javascript
PPTX
jQuery Data Manipulate API - A source code dissecting journey
PDF
JavaScript - Like a Box of Chocolates
PDF
Say It With Javascript
PDF
Introduction to ECMAScript 2015
ODP
Introduccion a Jasmin
PPT
Beginning Object-Oriented JavaScript
PPTX
Object oriented javascript
PPT
JSConf: All You Can Leet
PDF
Google Guava - Core libraries for Java & Android
PDF
JS Level Up: Prototypes
PDF
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
PDF
JavaScript patterns
PDF
Stop Making Excuses and Start Testing Your JavaScript
KEY
Javascript tid-bits
Intro to Advanced JavaScript
Everyday's JS
Web Optimization Summit: Coding for Performance
JavaScript for PHP developers
04 Advanced Javascript
jQuery Data Manipulate API - A source code dissecting journey
JavaScript - Like a Box of Chocolates
Say It With Javascript
Introduction to ECMAScript 2015
Introduccion a Jasmin
Beginning Object-Oriented JavaScript
Object oriented javascript
JSConf: All You Can Leet
Google Guava - Core libraries for Java & Android
JS Level Up: Prototypes
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
JavaScript patterns
Stop Making Excuses and Start Testing Your JavaScript
Javascript tid-bits

Recently uploaded (20)

PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPT
Teaching material agriculture food technology
PDF
Electronic commerce courselecture one. Pdf
PPTX
sap open course for s4hana steps from ECC to s4
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
KodekX | Application Modernization Development
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Approach and Philosophy of On baking technology
Digital-Transformation-Roadmap-for-Companies.pptx
Teaching material agriculture food technology
Electronic commerce courselecture one. Pdf
sap open course for s4hana steps from ECC to s4
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Programs and apps: productivity, graphics, security and other tools
Per capita expenditure prediction using model stacking based on satellite ima...
The Rise and Fall of 3GPP – Time for a Sabbatical?
Unlocking AI with Model Context Protocol (MCP)
KodekX | Application Modernization Development
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Network Security Unit 5.pdf for BCA BBA.
Reach Out and Touch Someone: Haptics and Empathic Computing
Building Integrated photovoltaic BIPV_UPV.pdf
MIND Revenue Release Quarter 2 2025 Press Release
Diabetes mellitus diagnosis method based random forest with bat algorithm
Advanced methodologies resolving dimensionality complications for autism neur...
MYSQL Presentation for SQL database connectivity
20250228 LYD VKU AI Blended-Learning.pptx
Approach and Philosophy of On baking technology

Object-oriented Javascript

  • 1. Object-oriented Javascript Daniel Ku (http://kjunine.net/)
  • 3. “Is Everything in JavaScript an object?”
  • 5. Primitives » string » number » boolean » undefined » null Everything else is object.
  • 6. “WHAT? Strings have properties and methods!”
  • 7. var p = 'hello'; p.test = 'test'; console.log(p.test); // ? var o = new String('hello'); o.test = 'test'; console.log(o.test); // ?
  • 8. var p = 'hello'; p.test = 'test'; console.log(p.test); // undefined var o = new String('hello'); o.test = 'test'; console.log(o.test); // test
  • 9. typeof 'hello'; // string typeof new String('hello'); // object typeof 10 // number typeof new Number(10); // object typeof false; // boolean typeof new Boolean(true); // object typeof undefined; // undefined typeof null; // object ???
  • 10. HOW to create an object?
  • 12. var createPerson = function(firstName, lastName) { return { firstName: firstName, lastName: lastName, sayHi: function() { return 'Hi there'; } }; }; var john = createPerson('John', 'Doe'); var jane = createPerson('Jane', 'Doe');
  • 13. IT WORKS! BUT, BAD PRACTICE!
  • 15. this is » window in global context » the object in an object
  • 16. var name = 'Jane'; var greet = function() { return 'My name is ' + this.name; } var person = { name: 'John', greet: greet }; greet(); // ? person.greet(); // ?
  • 17. var name = 'Jane'; var greet = function() { return 'My name is ' + this.name; } var person = { name: 'John', greet: greet }; greet(); // My name is Jane person.greet(); // My name is John
  • 18. var requestAsync = function(url, callback) { var data = 10; callback(data); }; var requestor = { value: 20, process: function(data) { var sum = this.value + data; console.log(sum); }, request: function() { var url = 'http://example.com'; requestAsync(url, this.process); } }; requestor.request(); // ?
  • 19. var requestAsync = function(url, callback) { var data = 10; callback(data); }; var requestor = { value: 20, process: function(data) { var sum = this.value + data; console.log(sum); }, request: function() { var url = 'http://example.com'; requestAsync(url, this.process); } }; requestor.request(); // NaN
  • 21. var requestAsync = function(url, callback) { var data = 10; callback(data); }; var requestor = { value: 20, process: function(data) { var sum = this.value + data; console.log(sum); }, request: function() { var url = 'http://example.com'; requestAsync(url, this.process.bind(this)); } }; requestor.request(); // 30
  • 23. var Person = function(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; this.sayHi = function() { return 'Hi~'; }; }; var person = new Person('John', 'Doe');
  • 24. Also, BAD PRACTICE! Do like next.
  • 25. var Person = function(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; }; Person.prototype.sayHi = function() { return 'Hi~'; }; var person = new Person('John', 'Doe');
  • 30. person.constructor === Person; // true person.__proto__ === Person.prototype; // true Object.getPrototypeOf(person) === Person.prototype; // true
  • 31. person.hasOwnProperty('firstName'); // true person.hasOwnProperty('lastName'); // true person.hasOwnProperty('sayHi'); // false person.constructor .prototype .hasOwnProperty('sayHi'); // true
  • 32. Properties and Property Descriptors
  • 33. var person = {}; Object.defineProperty(person, 'firstName', { // descriptor object (data descriptor) value: 'John', writable: true }); Object.defineProperty(person, 'lastName', { value: 'Doe', writable: false }); person.firstName; // 'John' person.lastName; // 'Doe'
  • 34. person.firstName = 'Jane'; person.firstName; // 'Jane' person.lastName = 'Dummy'; person.lastName; // 'Doe'
  • 35. var person = {}; Object.defineProperties(person, { firstName: { value: 'John', writable: true }, lastName: { value: 'Doe', writable: true }, fullName: { // accessor descriptor get: function() { return this.firstName + ' ' + this.lastName; }, set: function(value) { var splits = value.split(' '); this.firstName = splits[0]; this.lastName = splits[1]; } } });
  • 36. person.fullName; // 'John Doe' person.fullName = 'Jane Eyre' person.firstName; // 'Jane' person.lastName; // 'Eyre' person.fullName; // 'Jane Eyre'
  • 37. var person = {}; Object.defineProperty(person, 'firstName', { value: 'John', enumerable: true }); Object.defineProperty(person, 'lastName', { value: 'Doe', enumerable: false }); for (var key in person) { console.log(key, '=>' , person[key]); } // 'firstName => John'
  • 38. Object.defineProperty » Property Descriptors » Data Descriptors » Accessor Descriptors » reference » es5-shim
  • 39. Common Keys of Descriptors » configurable (default: false) » enumerable (default: false)
  • 40. Keys of Data Descriptors » value (default: undefined) » writable (default: false)
  • 41. Keys of Accessor Descriptors » get (default: undefined) » set (default: undefined)
  • 42. Constructors and the Prototype REVISITED
  • 43. var Person = function(firstName, lastName) { Object.defineProperty(this, 'firstName', { value: firstName, writable: true, enumerable: true }); Object.defineProperty(this, 'lastName', { value: lastName, writable: true, enumerable: true }); };
  • 44. Object.defineProperties(Person.prototype, { sayHi: { value: function() { return 'Hi there'; } }, fullName: { get: function() { return this.firstName + ' ' + this.lastName; }, enumerable: true } }); var person = new Person('John', 'Doe');
  • 45. HOW to do inheritance?
  • 48. var person = { firstName: 'John', lastName: 'Doe' }; var employee = Object.create(person); Object.getPrototypeOf(employee) === person; // true
  • 50. var Person = function(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; }; Person.prototype.sayHi = function() { return 'Hi~'; }; var person = new Person('John', 'Doe'); Object.getOwnPropertyDescriptor(Person.prototype, 'sayHi'); // {value: function, writable: true, enumerable: true, configurable: true} Object.getOwnPropertyDescriptor(person, 'firstName'); // {value: "John", writable: true, enumerable: true, configurable: true}
  • 52. var Person = function(firstName, lastName) { Object.defineProperties(this, { firstName: { value: firstName, writable: true, enumerable: true }, lastName: { value: lastName, writable: true, enumerable: true } }); }; Object.defineProperties(Person.prototype, { sayHi: { value: function() { return 'Hi there'; } }, fullName: { get: function() { return this.firstName + ' ' + this.lastName; }, enumerable: true } });
  • 53. var Employee = function(firstName, lastName, position) { Person.call(this, firstName, lastName); Object.defineProperties(this, { position: { value: position, writable: true, enumerable: true } }); };
  • 54. Employee.prototype = Object.create(Person.prototype, { sayHi: { value: function() { return Person.prototype.sayHi.call(this) + ' and here'; } }, fullName: { get: function() { var descriptor = Object.getOwnPropertyDescriptor(Person.prototype, 'fullName'); return descriptor.get.call(this) + ' ' + this.position; }, enumerable: true }, constructor: { value: Employee } });
  • 55. var employee = new Employee('John', 'Doe', 'Manager'); for (var key in employee) { console.log(key, '=>' , employee[key]); } // 'firstName => John' // 'lastName => Doe' // 'position => Manager' // 'fullName => John Doe Manager'
  • 58. Object.getPrototypeOf(employee) === Employee.prototype; // true employee.__proto__ === Employee.prototype; // true employee.__proto__.__proto__ === Person.prototype; // true employee.__proto__.__proto__.__proto__ === Object.prototype; // true employee.__proto__.__proto__.__proto__.__proto__ === null; // true
  • 59. References » Object-Oriented JavaScript on Tuts+ » Inheritance revisited on MDN » ECMA-262-5 in detail by Dmitry Soshnikov