• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
JavaScript Inheritance
 

JavaScript Inheritance

on

  • 525 views

 

Statistics

Views

Total Views
525
Views on SlideShare
525
Embed Views
0

Actions

Likes
1
Downloads
10
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    JavaScript Inheritance JavaScript Inheritance Presentation Transcript

    • INHERITANCE  
    • About  Inheritance   •  Code  reuse  is  important   – Inheritance  can  help   •  JavaScript  does  not  have  classes,  so  no  special   keyword  for  extending   •  In  JS  you  have  lot  of  ways  to  do  inheritance   – Classical  Pa@erns   – Modern  Pa@erns  or  Prototypal  Inheritance  
    • Understanding  JS  Inheritance   •  JS  is  not  class  based,  it’s  prototype-­‐based!   •  Object  inherit  from  another  object   •  JS  contains  syntax  and  features  that  make  it   seem  class  based    
    • Understanding  Prototypes   •  Prototype  is  an  object  from  which  other   objects  inherit  properGes   •  Any  object  can  be  a  prototype   •  Every  object  has  internal  __proto__  property  
    • Example   var parent = { method1: function() { print("A"); } } var child = { __proto__: parent, method2: function() { print("B"); } } // If method1 is not found in child, look it from // prototype! child.method1(); // A child.method2(); // B
    • __proto__   •  __proto__  is  depricated  and  should  not  be   used  (but  it  works)   •  To  get  the  prototype,  use   – Object.getPrototypeOf(object)   •  It’s  read  only!   •  How  to  set?   – Proposal:  Object.setPrototypeOf(obj,  prototype)   •  Not  possible  to  change  the  __proto__  ..!  
    • FuncGon  Object   •  When  wriGng   – function Animal() { } •  Lot  of  things  happens!   – Two  objects  created:     •  1)  Animal   •  2)  Animal.prototype   – Animal.prototype  has  a  property  constructor,  that   points  to  Animal  
    • FuncGon  Object   // This is just a function. Dog is Function object! function Dog (name) { this.name = (name); } var spot = new Dog("Spot"); // true print(spot instanceof Object); // true print(Dog instanceof Function); // true print(Dog instanceof Object);
    • FuncGon  Object   function sum1(a, b) { return a + b; } // => var sum2 = new Function("a","b", "return a+b;"); print(sum1(2,2)); // 4 print(sum2(2,2)); // 4 print(sum2.length); // number of args = 2 print(sum2.toString());
    • The  “new”  Operator   function Person() { this.name = “Jack”; } // Normal function call Person(); // Object creation var p = new Person();
    • Example   function Cat() { } // c.__proto__ points to Cat.prototype! var c = new Cat(); // true print(c.__proto__ === Cat.prototype); // c inherites Cat.prototype! Cat.prototype.age = 12; // 12! print(c.age);
    • Example   function Cat() { this.name = "Jack"; } var c = new Cat(); // true print(c.__proto__ === Cat.prototype); // c inherites Cat.prototype! Let's add stuff. Cat.prototype.age = 12; Cat.prototype.saySomething = function() { print(this.name + ": hello!"); } // 12! print(c.age); // "Jack: hello!" c.saySomething();
    • /** PERSON **/ function Person() { } var jack = new Person(); // jack inherites Person.prototype! print(jack.__proto__ === Person.prototype); Person.prototype.age = 18; print(jack.age); // 18; //** STUDENT **/ function Student() { } // Let's now change the prototype of Student. // Now Student.prototype points to Person. var temp = new Person(); Student.prototype = temp; var tina = new Student(); // tina inherites Student.prototype.. which is now temp! print(tina.__proto__ === Student.prototype); // true print(tina.__proto__ === temp); // true // Now tina inherites Student.prototype, which is // Person object, which inherites the Person.prototype.. print(tina.age); // 18!
    • Example   /** Person **/ function Person() { this.name = "Jack"; } // Adding functionality to the prototype.. Person.prototype.say = function() { print(this.name + ”: hello!"); } /** Student **/ function Student() { } // Inheritance Student.prototype = new Person(); /** Test **/ var student = new Student(); student.say(); // Jack: Hello Person.prototype   say()   new  Person()   name  =  “Jack”   __proto__  
    • Example   /** Person **/ function Person() { this.name = "Jack"; } // Adding functionality to the prototype.. What is this?? Person.prototype.say = function() { print(this.name + ”: hello!"); } /** Student **/ function Student() { } // Inheritance Student.prototype = new Person(); /** Test **/ var student = new Student(); student.say(); // Jack: Hello Person.prototype   say()   new  Person()   name  =  “Jack”   __proto__   new  Student()   __proto__  
    • FuncGon  Object   •  Every  funcGon  in  JS  is  a  FuncGon  object   •  When     – var spot = new Dog(“spot”); •  Then  spot’s  __proto__  points  to   Dog.prototype!   •  If  a  property  cannot  be  found  in  an  object,  it   is  searched  for  in  that  object's  prototype.  
    • Example   // here's the constructor: function Point() { } var a = new Point(); print (a.x); // undefined // set up the prototype object to have some values: Point.prototype = { x: 10, y: 20 }; // or you could do this: Point.prototype.z = 30; // make a new Point object // (a object gets an implicit reference to Point.prototype object) var a = new Point(); // Since a does not hold a property, let's look it from Point.prototype print (a.x);
    • Example   // here's the constructor: function Point() { this.x = 10; this.y = 20; } // set up the prototype object to have some values: Point.prototype.z = 40; // make a new Point object // (a object gets an implicit reference to Point.prototype object) var a = new Point(); // Since a does not hold a property, let's look it from Point.prototype print (a.z);
    • //** POINT ** function Point() { } // set up the prototype object to have some values: Point.prototype = { x: 10, y: 20 }; /** PIXEL **/ function Pixel() { } Pixel.prototype = new Point(); Pixel.prototype.color = "red"; // make a new Point object // (a object gets an implicit reference to Point.prototype object) var a = new Pixel(); var b = new Pixel(); a.color = "blue"; // Since a does not hold a property, let's look it from Point.prototype print (a.color); print (b.color);
    • About  constructors   •  Prototype  properGes  of  FuncGons  have  a   constructor  property:   – var  dog  =  new  Dog();   – dog.constructor  ==  Dog;  //  TRUE   •  This  will  break  when  doing  inheritance!  
    • /** Person **/ function Person() { } Person.prototype.name = "Jack"; /** Student **/ function Student() { this.id = "12345"; } // Inheritance Student.prototype = new Person(); Student.prototype.id = "12345"; /** Test **/ var student = new Student(); student.age = 22; print(student.age) print(student.name); print(student.id); var person = new Person(); print(person.constructor === Person); // TRUE var student = new Student(); print(student.constructor === Student); // FALSE
    • /** Person **/ function Person() { } Person.prototype.name = "Jack"; /** Student **/ function Student() { this.id = "12345"; } // Inheritance Student.prototype = new Person(); Student.prototype.id = "12345"; // FIX Student.prototype.constructor = Student; /** Test **/ var student = new Student(); student.age = 22; print(student.age) print(student.name); print(student.id); var person = new Person(); print(person.constructor === Person); // TRUE var student = new Student(); print(student.constructor === Student); // FALSE
    • Inheritance:  Prototypal   •  In  EcmaScript  5  a  protypal  inheritance  pa@ern  is   part  of  the  language   –  Object.create()   –  var  child  =  Object.create(parent);   •  The  create-­‐funcGon   function create(o) { function F() {} f.prototype = o; return new F(); }
    • Example   function Point(x,y) { this.x = x; this.y = y; } var pixel = Object.create(new Point(12,0)); pixel.color = "red"; print(pixel.x); print(pixel.color);