SlideShare une entreprise Scribd logo
1  sur  20
JavaScript Classes &
    Inheritance
      Marc Heiligers
      @marcheiligers
Basic JS Classes

Functions act as constructors
Functions have a prototype
Use new to create an instance of a type
Call instance methods with dot notation
function Animal() {
  this.name = "animal";
}

Animal.prototype.speak = function() {
   console.log("I'm a " + this.name);
};

var animal = new Animal();
animal.speak(); //logs "I'm a animal"
Object
All JS objects inherit from Object
Object has 2 standard methods:
    toString
    valueOf
Lot’s of non-standard and newer methods:
    https://developer.mozilla.org/en/JavaScript/Reference/
    Global_Objects/Object
Overriding Methods

Can override super class methods by:
   attaching new methods to the prototype property
   eg. Animal.prototype.toString = function() { ... }
console.log(animal.toString()); //logs "[object Object]"

Animal.prototype.toString = function() {
   return "[" + this.name + " Animal]";
};

console.log(animal.toString()); //logs "[animal Animal]"

console.log(animal.valueOf()); //logs Animal { name="animal",
↳speak=function(), toString=function()}

console.log("" + animal.valueOf()); //logs "[animal Animal]"

Animal.prototype.valueOf = function() {
   return this.name;
};

console.log(animal.valueOf()); //logs "animal"
Add methods to existing Classes
Add methods to the prototype of the existing class
All instances of the class will get those methods
You can extend built in classes too - with a couple of caveats
   Generally bad to extend the prototype of Object
   Generally accepted as bad to extend the prototype of
   DOM classes, although MooTools and Prototype do this
String.prototype.articulize = function() {
   if(["a", "e", "i", "o", "u"].indexOf(this[0].toLowerCase())
    ↳ >= 0) {
     return "an " + this;
   } else {
     return "a " + this;
   }
};

console.log("Pig".articulize()); // logs "a Pig"
console.log("Elephant".articulize()); // logs "an Elephant"

Animal.prototype.speak = function() {
   console.log("I'm " + this.name.articulize());
};
animal.speak(); //logs "I'm an animal"
Inheritance

Create a new constructor function
Assign a new instance of the base class to the prototype
   function A { ... }
   function B { ... }
   B.prototype = new A;
function Pig() {
  this.name = "pig";
}
Pig.prototype = new Animal;
var pig = new Pig();
pig.speak(); // logs "I'm a pig"
console.log(pig.toString()); // logs "[pig Animal]"

Animal.prototype.countLegs = function() {
   return this.legs || 0;
};
Pig.prototype.legs = 4;

console.log(animal.valueOf() + " has " + animal.countLegs() +
↳" legs"); // logs "animal has 0 legs";

console.log(pig.valueOf() + " has " + pig.countLegs() +
↳" legs"); // logs "pig has 4 legs";
function Eisbein() {
  this.legs = 1; // Instance variable
}
Eisbein.prototype = new Pig;

var eisbein = new Eisbein();
eisbein.speak(); // logs "I'm a pig"

console.log(eisbein.valueOf() + " has " +
↳eisbein.countLegs() + " legs");
↳// logs "pig has 1 legs";
Calling base class methods
Use Function#call to call the base class method in the context
of the current class
   Base.prototype.method.call(this);
Call is useful in many other places too
   Array.prototype.slice.call(arguments); //creates a real
   array from the arguments oject
Pig.prototype.speak = function() {
   Animal.prototype.speak.call(this);
   console.log("Snork");
};

pig.speak(); // logs "I'm a pignSnork"

Eisbein.prototype.speak = function() {
   Pig.prototype.speak.call(this);
   console.log("Sizzle");
};

eisbein.speak();
↳// logs "I'm a pignSnorknSizzle"
Making it Classical

Create a Class object to create classes
   make it look more like classical inheritance
   have easier access to super class methods
(function(global) {
  var isFn = function(fn) {
     return typeof fn == "function";
  };

  global.Class = function() {};
  global.Class.create = function(superClass) {
    var klass = function(magic) {
       // call init only if there's no magic cookie
       if(magic != isFn && isFn(this.init)) {
         this.init.apply(this, arguments);
       }
    };

    klass.prototype = new this(isFn);

    for(key in superClass) {
      (function(fn, superFn) { // create a closure
        k.prototype[key] = !isFn(fn) || !isFn(superFn) ? fn :
          function() {
             this.super = sfn;
             return fn.apply(this, arguments);
          };
      })(superClass[key], k.prototype[key]);
    }

    klass.prototype.constructor = klass;
    klass.extend = this.extend || this.create;

    return klass;
  };
})(this);
(function(global) {
  var isFn = function(fn) {
     return typeof fn == "function";
  };

  global.Class = function() {};
  global.Class.create = function(derived) {
    var klass = function(magic) {
       // call init only if there's no magic cookie
       if(magic != isFn && isFn(this.init)) {
         this.init.apply(this, arguments);
       }
    };
// use our private method as magic cookie
    klass.prototype = new this(isFn);

   for(key in derived) {
     (function(fn, superFn) { // create a closure
       klass.prototype[key] = !isFn(fn) || !isFn(superFn) ?
         fn :
         function() {
            this.super = superFn;
            return fn.apply(this, arguments);
         };
     })(derived[key], klass.prototype[key]);
   }

   klass.prototype.constructor = klass;
   klass.extend = this.extend || this.create;

    return klass;
  };
})(this);
var Animal = Class.create({
  init: function() {
     this.name = "animal";
  },
  speak: function() {
     console.log("I'm " + this.name.articulize());
  },
  toString: function() {
     return "[" + this.name + " Animal]";
  },
  valueOf: function() {
     return this.name;
  }
});

var animal = new Animal();
animal.speak(); // logs "I'm an animal"
console.log(animal.toString()); // logs [animal Animal]
console.log(animal.valueOf()); // logs animal
var Pig = Animal.extend({
  init: function() {
     this.name = "Pig";
  },
  speak: function() {
     this.super();
     console.log("Snork");
  }
});

var Eisbein = Pig.extend({
  speak: function() {
    this.super();
    console.log("Sizzle");
  }
});

var pig = new Pig();
pig.speak(); // logs "I'm a pignSnork"

var eisbein = new Eisbein();
eisbein.speak(); // logs "I'm a pignSnorknSizzle"
Questions?

Contenu connexe

Tendances

Doctrineのメモリーリークについて
DoctrineのメモリーリークについてDoctrineのメモリーリークについて
Doctrineのメモリーリークについて
t satoppejp
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
Seri Moth
 

Tendances (20)

連邦の白いヤツ 「Objective-C」
連邦の白いヤツ 「Objective-C」連邦の白いヤツ 「Objective-C」
連邦の白いヤツ 「Objective-C」
 
Doctrineのメモリーリークについて
DoctrineのメモリーリークについてDoctrineのメモリーリークについて
Doctrineのメモリーリークについて
 
Google Guava for cleaner code
Google Guava for cleaner codeGoogle Guava for cleaner code
Google Guava for cleaner code
 
Google Guava
Google GuavaGoogle Guava
Google Guava
 
ES6 PPT FOR 2016
ES6 PPT FOR 2016ES6 PPT FOR 2016
ES6 PPT FOR 2016
 
ES6
ES6ES6
ES6
 
Clean code with google guava jee conf
Clean code with google guava jee confClean code with google guava jee conf
Clean code with google guava jee conf
 
Perl
PerlPerl
Perl
 
What's New in PHP 5.5
What's New in PHP 5.5What's New in PHP 5.5
What's New in PHP 5.5
 
Google guava
Google guavaGoogle guava
Google guava
 
Google Guava
Google GuavaGoogle Guava
Google Guava
 
Linq introduction
Linq introductionLinq introduction
Linq introduction
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
 
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorProgramming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
 
Google guava overview
Google guava overviewGoogle guava overview
Google guava overview
 
Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!
 
EMFPath
EMFPathEMFPath
EMFPath
 
Google guava - almost everything you need to know
Google guava - almost everything you need to knowGoogle guava - almost everything you need to know
Google guava - almost everything you need to know
 
Introduction kot iin
Introduction kot iinIntroduction kot iin
Introduction kot iin
 
はじめてのGroovy
はじめてのGroovyはじめてのGroovy
はじめてのGroovy
 

Similaire à JavaScript Classes and Inheritance

Logic Equations Resolver J Script
Logic Equations Resolver   J ScriptLogic Equations Resolver   J Script
Logic Equations Resolver J Script
Roman Agaev
 
JSDay Italy - Backbone.js
JSDay Italy - Backbone.jsJSDay Italy - Backbone.js
JSDay Italy - Backbone.js
Pierre Spring
 
Soundreader.classpathSoundreader.project Soundre.docx
Soundreader.classpathSoundreader.project  Soundre.docxSoundreader.classpathSoundreader.project  Soundre.docx
Soundreader.classpathSoundreader.project Soundre.docx
whitneyleman54422
 

Similaire à JavaScript Classes and Inheritance (20)

Say It With Javascript
Say It With JavascriptSay It With Javascript
Say It With Javascript
 
Impress Your Friends with EcmaScript 2015
Impress Your Friends with EcmaScript 2015Impress Your Friends with EcmaScript 2015
Impress Your Friends with EcmaScript 2015
 
JavaScript - Like a Box of Chocolates
JavaScript - Like a Box of ChocolatesJavaScript - Like a Box of Chocolates
JavaScript - Like a Box of Chocolates
 
JS OO and Closures
JS OO and ClosuresJS OO and Closures
JS OO and Closures
 
Javascript tid-bits
Javascript tid-bitsJavascript tid-bits
Javascript tid-bits
 
Coding using jscript test complete
Coding using jscript test completeCoding using jscript test complete
Coding using jscript test complete
 
JavaScript Survival Guide
JavaScript Survival GuideJavaScript Survival Guide
JavaScript Survival Guide
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
Logic Equations Resolver J Script
Logic Equations Resolver   J ScriptLogic Equations Resolver   J Script
Logic Equations Resolver J Script
 
JS Level Up: Prototypes
JS Level Up: PrototypesJS Level Up: Prototypes
JS Level Up: Prototypes
 
JSDay Italy - Backbone.js
JSDay Italy - Backbone.jsJSDay Italy - Backbone.js
JSDay Italy - Backbone.js
 
ECMAScript 6 new features
ECMAScript 6 new featuresECMAScript 6 new features
ECMAScript 6 new features
 
Class
ClassClass
Class
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
 
Intro to Advanced JavaScript
Intro to Advanced JavaScriptIntro to Advanced JavaScript
Intro to Advanced JavaScript
 
Basic inheritance in JavaScript
Basic inheritance in JavaScriptBasic inheritance in JavaScript
Basic inheritance in JavaScript
 
JavaScript patterns
JavaScript patternsJavaScript patterns
JavaScript patterns
 
Soundreader.classpathSoundreader.project Soundre.docx
Soundreader.classpathSoundreader.project  Soundre.docxSoundreader.classpathSoundreader.project  Soundre.docx
Soundreader.classpathSoundreader.project Soundre.docx
 
Prototypes
PrototypesPrototypes
Prototypes
 
Java.lang.object
Java.lang.objectJava.lang.object
Java.lang.object
 

Dernier

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 

JavaScript Classes and Inheritance

  • 1. JavaScript Classes & Inheritance Marc Heiligers @marcheiligers
  • 2. Basic JS Classes Functions act as constructors Functions have a prototype Use new to create an instance of a type Call instance methods with dot notation
  • 3. function Animal() { this.name = "animal"; } Animal.prototype.speak = function() { console.log("I'm a " + this.name); }; var animal = new Animal(); animal.speak(); //logs "I'm a animal"
  • 4. Object All JS objects inherit from Object Object has 2 standard methods: toString valueOf Lot’s of non-standard and newer methods: https://developer.mozilla.org/en/JavaScript/Reference/ Global_Objects/Object
  • 5. Overriding Methods Can override super class methods by: attaching new methods to the prototype property eg. Animal.prototype.toString = function() { ... }
  • 6. console.log(animal.toString()); //logs "[object Object]" Animal.prototype.toString = function() { return "[" + this.name + " Animal]"; }; console.log(animal.toString()); //logs "[animal Animal]" console.log(animal.valueOf()); //logs Animal { name="animal", ↳speak=function(), toString=function()} console.log("" + animal.valueOf()); //logs "[animal Animal]" Animal.prototype.valueOf = function() { return this.name; }; console.log(animal.valueOf()); //logs "animal"
  • 7. Add methods to existing Classes Add methods to the prototype of the existing class All instances of the class will get those methods You can extend built in classes too - with a couple of caveats Generally bad to extend the prototype of Object Generally accepted as bad to extend the prototype of DOM classes, although MooTools and Prototype do this
  • 8. String.prototype.articulize = function() { if(["a", "e", "i", "o", "u"].indexOf(this[0].toLowerCase()) ↳ >= 0) { return "an " + this; } else { return "a " + this; } }; console.log("Pig".articulize()); // logs "a Pig" console.log("Elephant".articulize()); // logs "an Elephant" Animal.prototype.speak = function() { console.log("I'm " + this.name.articulize()); }; animal.speak(); //logs "I'm an animal"
  • 9. Inheritance Create a new constructor function Assign a new instance of the base class to the prototype function A { ... } function B { ... } B.prototype = new A;
  • 10. function Pig() { this.name = "pig"; } Pig.prototype = new Animal; var pig = new Pig(); pig.speak(); // logs "I'm a pig" console.log(pig.toString()); // logs "[pig Animal]" Animal.prototype.countLegs = function() { return this.legs || 0; }; Pig.prototype.legs = 4; console.log(animal.valueOf() + " has " + animal.countLegs() + ↳" legs"); // logs "animal has 0 legs"; console.log(pig.valueOf() + " has " + pig.countLegs() + ↳" legs"); // logs "pig has 4 legs";
  • 11. function Eisbein() { this.legs = 1; // Instance variable } Eisbein.prototype = new Pig; var eisbein = new Eisbein(); eisbein.speak(); // logs "I'm a pig" console.log(eisbein.valueOf() + " has " + ↳eisbein.countLegs() + " legs"); ↳// logs "pig has 1 legs";
  • 12. Calling base class methods Use Function#call to call the base class method in the context of the current class Base.prototype.method.call(this); Call is useful in many other places too Array.prototype.slice.call(arguments); //creates a real array from the arguments oject
  • 13. Pig.prototype.speak = function() { Animal.prototype.speak.call(this); console.log("Snork"); }; pig.speak(); // logs "I'm a pignSnork" Eisbein.prototype.speak = function() { Pig.prototype.speak.call(this); console.log("Sizzle"); }; eisbein.speak(); ↳// logs "I'm a pignSnorknSizzle"
  • 14. Making it Classical Create a Class object to create classes make it look more like classical inheritance have easier access to super class methods
  • 15. (function(global) { var isFn = function(fn) { return typeof fn == "function"; }; global.Class = function() {}; global.Class.create = function(superClass) { var klass = function(magic) { // call init only if there's no magic cookie if(magic != isFn && isFn(this.init)) { this.init.apply(this, arguments); } }; klass.prototype = new this(isFn); for(key in superClass) { (function(fn, superFn) { // create a closure k.prototype[key] = !isFn(fn) || !isFn(superFn) ? fn : function() { this.super = sfn; return fn.apply(this, arguments); }; })(superClass[key], k.prototype[key]); } klass.prototype.constructor = klass; klass.extend = this.extend || this.create; return klass; }; })(this);
  • 16. (function(global) { var isFn = function(fn) { return typeof fn == "function"; }; global.Class = function() {}; global.Class.create = function(derived) { var klass = function(magic) { // call init only if there's no magic cookie if(magic != isFn && isFn(this.init)) { this.init.apply(this, arguments); } };
  • 17. // use our private method as magic cookie klass.prototype = new this(isFn); for(key in derived) { (function(fn, superFn) { // create a closure klass.prototype[key] = !isFn(fn) || !isFn(superFn) ? fn : function() { this.super = superFn; return fn.apply(this, arguments); }; })(derived[key], klass.prototype[key]); } klass.prototype.constructor = klass; klass.extend = this.extend || this.create; return klass; }; })(this);
  • 18. var Animal = Class.create({ init: function() { this.name = "animal"; }, speak: function() { console.log("I'm " + this.name.articulize()); }, toString: function() { return "[" + this.name + " Animal]"; }, valueOf: function() { return this.name; } }); var animal = new Animal(); animal.speak(); // logs "I'm an animal" console.log(animal.toString()); // logs [animal Animal] console.log(animal.valueOf()); // logs animal
  • 19. var Pig = Animal.extend({ init: function() { this.name = "Pig"; }, speak: function() { this.super(); console.log("Snork"); } }); var Eisbein = Pig.extend({ speak: function() { this.super(); console.log("Sizzle"); } }); var pig = new Pig(); pig.speak(); // logs "I'm a pignSnork" var eisbein = new Eisbein(); eisbein.speak(); // logs "I'm a pignSnorknSizzle"

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n