Simulating OOP in JavaScript Function Constructor, Prototypes, "this" Object, Classical and Prototypal Model Software University Technical.

Slides:



Advertisements
Similar presentations
Classical OOP in JavaScript Classes and stuff Telerik Software Academy
Advertisements

C# Advanced Topics Methods, Classes and Objects SoftUni Team Technical Trainers Software University
AngularJS Routing Routes, Route Parameters, Templates, Location, Navigation SoftUni Team Technical Trainers Software University
AngularJS Services Built-in and Custom Services SoftUni Team Technical Trainers Software University
Methods Writing and using methods, overloads, ref, out SoftUni Team Technical Trainers Software University
Software University Curriculum, Courses, Exams, Jobs SoftUni Team Technical Trainers Software University
Fundamentals SoftUni Welcome to Software University SoftUni Team Technical Trainers Software University
Advanced JavaScript Course Introduction SoftUni Team Technical Trainers Software University
Project Tracking Tools Trello, Asana, Basecamp, GitHub Issue Tracker, TRAC SoftUni Team Technical Trainers Software University
AngularJS Directives Defining Custom Directives SoftUni Team Technical Trainers Software University
Software Testing Lifecycle Exit Criteria Evaluation, Continuous Integration Ivan Yonkov Technical Trainer Software University.
High-Quality Programming Code Code Correctness, Readability, Maintainability, Testability, Etc. SoftUni Team Technical Trainers Software University
JavaScript Design Patterns Private Fields, Module, Revealing Module, Revealing Prototype, … Software University Technical Trainers SoftUni.
Loops Repeating Code Multiple Times SoftUni Team Technical Trainers Software University
Entity Framework Performance SoftUni Team Technical Trainers Software University
Build Processes and Continuous Integration Automating Build Processes Software University Technical Trainers SoftUni Team.
Processing Redis with.NET How to Operate with Redis Databases SoftUni Team Technical Trainers Software University
Project Tracking Tools Trello, Asana, Basecamp, GitHub Issue Tracker, TRAC Angel Georgiev Part-time Trainer Software University
Test-Driven Development Learn the "Test First" Approach to Coding SoftUni Team Technical Trainers Software University
Defining Classes Classes, Fields, Constructors, Methods, Properties SoftUni Team Technical Trainers Software University
Functions Reusable Parts of Code SoftUni Team Technical Trainers Software University
Static Members and Namespaces Static Members, Indexers, Operators, Namespaces SoftUni Team Technical Trainers Software University
JavaScript Best Practices Learn How to Write Better Quality JavaScript Software University Technical Trainers SoftUni Team.
Templating, Routing, lodash Extending functionality using Collections SoftUni Team Technical Trainers Software University
Controllers and Markup Controllers, $scope, Markup, Directives, Expressions, Binding, Filters, Validation SoftUni Team Technical Trainers Software University.
AMD and RequireJS Splitting JavaScript Code into Dependent Modules Software University Technical Trainers SoftUni Team.
Asynchronous Web Services Writing Asynchronous Web Services SoftUni Team Technical Trainers Software University
Defining Classes Classes, Fields, Constructors, Methods, Properties Svetlin Nakov Technical Trainer Software University
Jekyll Static Site Generator Template-Based Site Generation Svetlin Nakov Technical Trainer Software University
JavaScript Modules and Patterns Private Fields, Module, Revealing Module, Revealing Prototype, … Software University Technical Trainers.
Responsive Design Design that Adapts to Different Devices SoftUni Team Technical Trainers Software University
Processing JSON in.NET JSON, JSON.NET LINQ-to-JSON and JSON to XML SoftUni Team Technical Trainers Software University
Tables, Rows, Columns, Cells, Header, Footer, Colspan, Rowspan
Associative Arrays and Objects Associative Arrays, Objects Svetlin Nakov Technical Trainer Software University
High-Quality Programming Code Code Correctness, Readability, Maintainability Svetlin Nakov Technical Trainer Software University
CSS Transitions and Animations Animated HTML Elements SoftUni Team Technical Trainers Software University
High-Quality Code: Course Introduction Course Introduction SoftUni Team Technical Trainers Software University
Design Patterns: Structural Design Patterns General and reusable solutions to common problems in software design Software University
Prototype Chain and Inheritance Prototype chain, Inheritance, Accessing Base Members Software University Technical Trainers SoftUni Team.
Events Event Handling in JavaScript SoftUni Team Technical Trainers Software University
Object-Oriented Programming Course Introduction Svetlin Nakov Technical Trainer Software University
Reflection Programming under the hood SoftUni Team Technical Trainers Software University
Mocking with Moq Tools for Easier Unit Testing SoftUni Team Technical Trainers Software University
Mocking Unit Testing Methods with External Dependencies SoftUni Team Technical Trainers Software University
Mocking with Moq Mocking tools for easier unit testing Svetlin Nakov Technical Trainer Software University
Test-Driven Development Learn the "Test First" Approach to Coding Svetlin Nakov Technical Trainer Software University
Sets, Dictionaries SoftUni Team Technical Trainers Software University
Creating Content Defining Topic, Creating Technical Training Materials SoftUni Team Technical Trainers Software University
High-Quality Code: Course Introduction Course Introduction SoftUni Team Technical Trainers Software University
Functional Programming Data Aggregation and Nested Queries Ivan Yonkov Technical Trainer Software University
Doctrine The PHP ORM SoftUni Team Technical Trainers Software University
JavaScript Best Practices Learn How to Write Better Quality JavaScript Software University Technical Trainers SoftUni Team.
Creating Content Defining Topic, Creating Technical Training Materials SoftUni Team Technical Trainers Software University
Web Storage and Cookies Cookies, Local and Session Storage SoftUni Team Technical Trainers Software University
First Steps in PHP Creating Very Simple PHP Scripts SoftUni Team Technical Trainers Software University
Inheritance Class Hierarchies SoftUni Team Technical Trainers Software University
Advanced JavaScript Course Introduction SoftUni Team Technical Trainers Software University
Static Members Static Variables & Methods SoftUni Team Technical Trainers Software University
Stacks and Queues Processing Sequences of Elements SoftUni Team Technical Trainers Software University
Generics SoftUni Team Technical Trainers Software University
High-Quality Programming Code Code Correctness, Readability, Maintainability, Testability, Etc. SoftUni Team Technical Trainers Software University
Abstract Classes, Abstract Methods, Override Methods
Services & Dependency Injection
Classes and Class Members
Classes, Properties, Constructors, Objects, Namespaces
Mocking tools for easier unit testing
Classes and Class Members
Extending functionality using Collections
Inheritance and Prototypes
First-Class Functions
Presentation transcript:

Simulating OOP in JavaScript Function Constructor, Prototypes, "this" Object, Classical and Prototypal Model Software University Technical Trainers SoftUni Team

Table of Contents  Object-Oriented Programming  Is there OOP in JavaScript?  Classical OOP in JavaScript  Prototypes  Object Properties  Function Constructors  The value of the this object  Prototypal OOP  JavaScript OOP Frameworks 2

Object-Oriented Programming And How It Works in JavaScript

 OOP means that the application is constructed as a set of objects  Each object has its purpose  Each object can hold other objects  JavaScript is prototype-oriented language  Uses prototypes to define its properties  Does not have definition for class or constructor  ECMAScript 6 introduces classes Object-Oriented Programming 4

 JavaScript is a dynamic language  No such things as polymorphism  JavaScript is also highly expressive language  Most things can be achieved in many ways  That is why JavaScript has many ways to support OOP  Classical (Functional), Prototypal  Each has its advantages and drawbacks  Usage depends on the case OOP in JavaScript 5

Classical OOP in JavaScript

 JavaScript uses functions to create objects  It has no definition for class or constructor  Functions play the role of object constructors  Create/initiate objects is done by calling the function with the " new " keyword  There is no need to explicitly define a constructor method Classical OOP function Person() {} var gosho = new Person(); // instance of Person 7

 When using a function as an object constructor it is executed when called with new  Each of the instances is independent  They have their own state and behavior Creating Objects function Person() {} var gosho = new Person(); // instance of Person var maria = new Person(); // another instance of Person gosho.name = "George"; maria.name = "Maria"; console.log(gosho.name); // George console.log(maria.name); // Maria 8

 Function constructors can take parameters to give different state to instances  Just a regular function with parameters, invoked with new Function Constructor with parameters function Person(name, age){ console.log("Name: " + name + ", Age: " + age); console.log("Name: " + name + ", Age: " + age);} var gosho = new Person("Georgi", 23); // Name: Georgi, Age: 23 var maria = new Person("Maria", 18); // Name: Maria, Age: 18 9

Function Constructors Live Demo

The new keyword

12  How does the new keyword work in JavaScript? The new keyword function newObject(func) { var args = Array.prototype.slice.call(arguments, 1); var args = Array.prototype.slice.call(arguments, 1); var object = Object.create(func.prototype); var object = Object.create(func.prototype); var result = func.apply(object, args); var result = func.apply(object, args); return (typeof result === 'object' && result) || object; return (typeof result === 'object' && result) || object;} Get all arguments except the first one Create a object with prototype func prototype Invoke constructor passing the new object as this var pesho = newObject(Person, "Peter", "Shmatov"); var pesho2 = new Person("Peter", "Shmatov"); The same Return the new object

The new keyword Live Demo

Object Members Attaching Properties and Methods

 Objects can also define custom state  Custom properties that only instances of this type have  Use the keyword this to attach properties to object Object Members – Properties function Person(name, age) { this._name = name; this._name = name; this._age = age; this._age = age;} var maria = new Person("Mariika", 18); console.log(maria._name); // Mariika maria._name = "Peter"; console.log(maria._name); // Peter 15

 Property values can be either variables or functions  Functions attached to object are called methods Object Members – Methods function Person(name, age) { this._name = name; this._name = name; this._age = age; this._age = age; this.sayHello = function() { this.sayHello = function() { console.log("My name is " + this._name + console.log("My name is " + this._name + " and I'm " + this._age + " years old"); " and I'm " + this._age + " years old"); }} var maria = new Person("Maria", 18); maria.sayHello(); // My name is Maria and I'm 18 years old 16

Object Members Live Demo

Attaching Methods to the Prototype

 Attaching methods in the object constructor is a tricky operation  Its is slow (repeated at each object creation)  Every object has a different (duplicated) function instance Attaching Methods function Person(name, age) { this.introduce = function() { this.introduce = function() { return 'Name: ' + name + ', Age: ' + age; return 'Name: ' + name + ', Age: ' + age; }; };} var p1 = new Person(); var p2 = new Person(); console.log(p1.introduce === p2.introduce); // false 19

 Instead of attaching the methods to this in the constructor  Attach them to the prototype of the constructor  Methods attached to constructor's prototype are created exactly once Better Method Attachment function Person(name, age) { this.sayHello = function() { this.sayHello = function() { //... //... }} function Person(name, age) { } Person.prototype.sayHello = function() { //... //...} 20

Attaching Methods to the Prototype Live Demo

 Attaching to this Code closer to other languages Hidden data Not good performance  JavaScript is NO other language!  Hidden data is not a big problem. Prefix "hidden" data with _ Pros and Cons when Attaching Methods  Attaching to prototype Using JavaScript as it is meant No hidden data A way better performance 22

The this Object

 this is a special kind of object  It is available everywhere in JavaScript  It has different meaning in different contexts  The this object can have two different values:  The parent scope  The value of this of the containing scope  If none of the parents is object, its value is window / global object  A concrete object  When using the new operator The this Object 24

 When executed over a function, without the new operator  this refers to the parent scope this in Function Scope function Person(name) { this._name = name; this._name = name; this.getName = function getPersonName() { this.getName = function getPersonName() { return this._name; return this._name; }} var p = new Person("Gosho"); var getName = p.getName; console.log(p.getName()); // Gosho console.log(getName()); // undefined Here this means the Person object Here this means its parent scope (window) 25

The this Function Object Live Demo

 this doesn't make a closure  The only way to make closure is to cache this in another variable  Then we can call functions without context  Doesn't work for methods attached to the prototype Function Constructors – caching this function Person(name) { var self = this; var self = this; self._name = name; self._name = name; self.getName = function getPersonName() { self.getName = function getPersonName() { return self._name; return self._name; }} var p = new Person("Peter"); var getPersonName = p.getName; console.log(getPersonName()); // Logs: Peter Creating closure (holding this ) 27

 JavaScript cannot limit function to be used only as constructors  JavaScript was designed for simple UI purposes  To mark something as contructor, name it in PascalCase  Convention: PascalCase-named functions should be called with new Function Constructors – call without new function Person(name) { this._name = name; this._name = name; this.getName = function getPersonName() { this.getName = function getPersonName() { return this._name; return this._name; }} var p = Person("Peter"); What will be the value of this ? 28

Invoking Function Constructors Without new Live Demo

function Person(name, age) { if (!(this instanceof arguments.callee)) { if (!(this instanceof arguments.callee)) { return new arguments.callee(name, age); return new arguments.callee(name, age); } this._name = name; this._name = name; this._age = age; this._age = age;}  John Resig (jQuery) designed a simple way to check if the function is not used as constructor: Function Constructor Fix If this is not of type the function, call the function with new 30

John Resig Constructor Fix Live Demo

Function Constructors with Modules

 Function constructors can be put inside a module  Introduces a better abstraction of the code  Allows to hide constants and functions Constructors with Modules var Person = (function () { var MAX_NAME_LENGTH = 50; // private const var MAX_NAME_LENGTH = 50; // private const function Person(name) { // constructor function Person(name) { // constructor this._name = name; this._name = name; } Person.prototype.walk = // public method Person.prototype.walk = // public method function (distance) { … }; function (distance) { … }; function calcDistance(…) { // private function calcDistance(…) { // private … // function hidden in the module … // function hidden in the module } return Person; return Person;}()); 33

Function Constructors with Modules Live Demo

Hidden Functions What to Do When We Want to Hide Something?

 When a function constructor is wrapped inside a module:  The module can hold hidden functions  The function constructor can use these hidden functions  Yet, to use these functions as object methods, we should use apply(…) or call(…)  In order to pass correct this Hidden Functions 36

Hidden Functions: Example var Rect = (function () { function validatePosition() { function validatePosition() { // … // … } function Rect(x, y, width, height) { function Rect(x, y, width, height) { var isPositionValid = validatePosition.call(this); var isPositionValid = validatePosition.call(this); if (!isPositionValid) { if (!isPositionValid) { throw new Error('Invalid Rect position'); throw new Error('Invalid Rect position'); } } Rect.prototype = { /* … */ }; Rect.prototype = { /* … */ }; return Rect; return Rect;}()); This function is not exposed from the module Using call() to invoke the function over this 37

Hidden Functions Live Demo

Methods Attached to the Function Constructor var Rect = (function () { function Rect(width, height) { function Rect(width, height) { this.width = width; this.width = width; this.height = height; this.height = height; } Rect.prototype.calculateArea = function () { }; Rect.prototype.calculateArea = function () { }; Rect.isSquare = function(rect) { Rect.isSquare = function(rect) { return rect.width === rect.height; return rect.width === rect.height; } return Rect; return Rect;}()); 39 Works as a static method. Invoked through the class, not through the instances. Should not access this.

Prototypal OOP Another Way to Work with Classes in JS

 Prototypal OOP uses the prototype nature of JS to produce objects  Objects are created from objects, instead from functions  Simple approach: all properties / methods are public Prototypal OOP 41 var Person = { init: function(name) { init: function(name) { this._name = name; this._name = name; return this; return this; }, }, introduce: function introduce() { introduce: function introduce() { return "Hello my name is: " + this._name; return "Hello my name is: " + this._name; }} var pesho = Object.create(Person).init('Peter'); console.log(pesho.introduce()); // Name: Peter, Age: 69 Creating an object from Person The init() function works as a constructor

Prototypal OOP Live Demo

 Classical OOP in JavaScript  Prototypal OOP in JavaScript Difference between Classical and Prototypal Model function Person(name) { this._name = name; this._name = name;} var pesho = new Person("Peter"); var PersonPrototype = { init: function personConstructor(name) { init: function personConstructor(name) { this._name = name; this._name = name; }} var pesho = Object.create(PersonPrototype); pesho.init("Peter");

OOP Frameworks for JavaScript

JS OOP Frameworks  OOP is a primary design paradigm in most programming languages  Yet, OOP in JavaScript is not that perfect  CofeeScript and TypeScript have better OOP  And that is why every framework has its own way of doing OOP  YUI, Prototype.js, Backbone.js, etc…  If none of these does the job well (for example, it is too heavy), you can use a simple implementation by John Resig 45

46  John Resig's Simple Inheritance var Shape = Class.extend({ init: function(x, y) { init: function(x, y) { this._x = x; this._x = x; this._y = y; this._y = y; }, }, serialize: function() { serialize: function() { return { return { x: this._x, x: this._x, y: this._y y: this._y }; }; }}); Create a class init() function is required

47 John Resig Simple Inheritance var Rect = Shape.extend({ init: function(x, y, w, h) { init: function(x, y, w, h) { this._super(x, y); this._super(x, y); this._width = w; this._width = w; this._height = h; this._height = h; }, }, serialize: function() { serialize: function() { var res = this._super(); var res = this._super(); res.width = this._width; res.width = this._width; res.height = this._height; res.height = this._height; return res; return res; }}); Calling the parent constructor Calling the parent serialize() Inherit Shape

John Resig's Simple Inheritance Live Demo

? ? ? ? ? ? ? ? ? Simulating OOP in JavaScript

License  This course (slides, examples, demos, videos, homework, etc.) is licensed under the "Creative Commons Attribution- NonCommercial-ShareAlike 4.0 International" licenseCreative Commons Attribution- NonCommercial-ShareAlike 4.0 International 50  Attribution: this work may contain portions from  “JavaScript OOP" course by Telerik Academy under CC-BY-NC-SA licenseJavaScript OOPCC-BY-NC-SA

Free Software University  Software University Foundation – softuni.orgsoftuni.org  Software University – High-Quality Education, Profession and Job for Software Developers  softuni.bg softuni.bg  Software Facebook  facebook.com/SoftwareUniversity facebook.com/SoftwareUniversity  Software YouTube  youtube.com/SoftwareUniversity youtube.com/SoftwareUniversity  Software University Forums – forum.softuni.bgforum.softuni.bg