Allen Fields
Allen Fields

Reputation: 7

Output not correct, unsure of how to fix

I have to have two arguements, name and dept, and made a name and dept instance variable that defaults to name unknown and department unknown, then make the get and set methods for them, but each time I run this it gives me the class name and dept is undefined

Well originally I didn't have it in a class and had it as a straight const function, and it was working, but when I couldn't reference it properly in another file, I was told they need to be put in a class which I tried, and now its not giving the output I need.

class Faculty {
    constructor(name, dept) {   
        this.name = "name unknown";
        this.dept = "department unknown";
    }
    getName() {
        return this.name;
    }
    getDept() {
        return this.dept;
    }

    setName(name) {
        this.name = name;

    }
    setDept(dept) {
        this.dept = dept;
    }
}

Faculty.toString = function () {
        return this.name.concat(" of ").concat(this.dept);
}
//Faculty.name = "Testname";
//Faculty.dept = "Electronic Technology";
console.log(Faculty.toString());

When ran it gives Faculty of undefined, even when I try to define name, it still just says Faculty, though I need it to be of that defaults to name unknown of department unknown unless set otherwise.

Upvotes: 0

Views: 59

Answers (3)

Mouradif
Mouradif

Reputation: 2694

Here's how I would put it (and it works)

EDIT : Since this answer was chosen, I will add here the good elements pointed by the other answers

const DEFAULT_NAME = "name unknown";
const DEFAULT_DEPT = "department unknown";

class Faculty {
    constructor(name = DEFAULT_NAME, dept DEFAULT_DEPT) {   
        this.name = name;
        this.dept = dept;
    }
    getName() {
        return this.name;
    }
    getDept() {
        return this.dept;
    }

    setName(name) {
        this.name = name;

    }
    setDept(dept) {
        this.dept = dept;
    }

    toString() {
        return `${this.name} of ${this.dept}`;
    }
}

const f = new Faculty("Faculty", "Department");
console.log(f.toString());

Upvotes: 1

Tyler Roper
Tyler Roper

Reputation: 21672

For one, you'd have to create a new instance of Faculty in order to call one of its class methods.

Second, there's no need to declare the toString method outside of the class; it can be included just as the others.

Third, I think the method itself could be simplified/clarified by using template literals.

const DEFAULT_NAME = "name_unknown";
const DEFAULT_DEPARTMENT = "department_unknown";

class Faculty {
    constructor(name, dept) {   
        this.name = name || DEFAULT_NAME;
        this.dept = dept || DEFAULT_DEPARTMENT;
    }
    getName() {
        return this.name;
    }
    getDept() {
        return this.dept;
    }

    setName(name) {
        this.name = name;
    }
    
    setDept(dept) {
        this.dept = dept;
    }
    
    toString() {
        return `${this.name} of ${this.dept}`
    }
}

//With name and department
const faculty = new Faculty("John Smith", "Department XYZ");
console.log(faculty.toString());

//Without name and department
const faculty_default = new Faculty();
console.log(faculty_default.toString());

Upvotes: 1

Karim Chaari
Karim Chaari

Reputation: 402

Also you can use the default params like this :

class Faculty {
  constructor(name = 'name unknown', dept = 'department unknown') {
    this.name = name;
    this.dept = dept;
  }
  getName() {
    return this.name;
  }
  getDept() {
    return this.dept;
  }

  setName(name) {
    this.name = name;
  }
  setDept(dept) {
    this.dept = dept;
  }

  toString() {
    return `${this.name} of ${this.dept}`;
  }
}

const f = new Faculty('Alex', 'Maths');
console.log(f.toString());

Upvotes: 1

Related Questions