Search code examples
javascriptclassinheritanceloggingprototype

Inherited methods not printing expected values in Javascript


In following code I'm expecting to print the values passed in to them as sentences. But instead program is printing the declaring function to the console.

class Person {

  constructor(firstName, lastName){
    this._firstName = firstName;
    this._lastName = lastName;
  }

  printName() {
    return `Hello my name is ${this.firstName} ${this.lastName}`
  }
}

class Staff extends Person {

  constructor(firstName, lastName, employeeID, location){
    super(firstName, lastName);
    this._employeeID = employeeID;
    this._location = location
  }

  printName(){
    return `${super.printName}, my staff ID is ${this.employeeID}`
  }

  facilitatedBranch(){
    return `My branch is ${this._location}`
  }
}

class ProjectManager extends Staff {

  constructor(firstName, lastName, employeeID, location, project){
    super(firstName, lastName, employeeID, location);
    this._project = project;
  }

  printPmInfo(){
    return `${super.printName} ${super.facilitatedBranch} my project is ${this._project}`
  }
}

let jhon = new ProjectManager('Jhon', 'Snow', 212 , 'Colombo', 'Blood Bank');
console.log(jhon.printPmInfo());

My expected output should be "Hello my name is Jhon Snow, my staff ID is 212 My branch is Colombo my project is blood bank"


Solution

  • Problem

    In your current code, you never call printName or facilitatedBranch.

    console.log converts all arguments to string by default.

    In JavaScript, function.toString() returns stringified body of the function.

    printPmInfo(){
      return `${super.printName} ${super.facilitatedBranch} my project is ${this._project}`
    }
    

    Solution

    Call printName and facilitatedBranch to actually run the functions and get the value.

    printPmInfo(){
      return `${super.printName()} ${super.facilitatedBranch()} my project is ${this._project}`
    }
    

    Final version:

    class Person {
    
      constructor(firstName, lastName) {
        this._firstName = firstName;
        this._lastName = lastName;
      }
    
      printName() {
        return `Hello my name is ${this._firstName} ${this._lastName}`
      }
    }
    
    class Staff extends Person {
    
      constructor(firstName, lastName, employeeID, location) {
        super(firstName, lastName);
        this._employeeID = employeeID;
        this._location = location
      }
    
      printName() {
        return `${super.printName()}, my staff ID is ${this._employeeID}`
      }
    
      facilitatedBranch() {
        return `My branch is ${this._location}`
      }
    }
    
    class ProjectManager extends Staff {
    
      constructor(firstName, lastName, employeeID, location, project) {
        super(firstName, lastName, employeeID, location);
        this._project = project;
      }
    
      printPmInfo() {
        return `${super.printName()} ${super.facilitatedBranch()} my project is ${this._project}`
      }
    }
    
    let jhon = new ProjectManager('Jhon', 'Snow', 212, 'Colombo', 'Blood Bank');
    console.log(jhon.printPmInfo());