FAQ: Classes - Inheritance IV

Hello, @digital8256053093.

Does your code by chance include a getter similar to this?

  get remainingVacationDays() {
    return this._remainingVacationDays;
  }

Yes. Why is that significant, relative to the naming convention?

When this line is executed:

The getter method is invoked. The getter returns the value. Your original code accessed the backing variable directly. We are trying to avoid direct access by using the getter instead. By not accessing the backing variable directly we have a bit of protection in place for the value assigned to it.

Methods are typically invoked like this nurseOlynyk.remainingVacationDays(); with the () at the end. Since we used the keyword get we are able to invoke the method without the ().

2 Likes

Thank you. It seems so obvious now. It seems odd to me that I missed that before.

1 Like

Maybe a strange question… but why is it that when we create the nurse class that inherits properties from the HospitalEmployee class we only use ‘super’ for the name? why would it not also inherit the remainingDaysOff? my initial thought was to include it but I got it wrong and had to look at the hint to see what I had done wrong. Not a huge deal but I just am not clear on the why…

name is the only variable we need instantiated by the parent class.

It is inherited with a value already set. If we want a different value then we need to initialize it in the subclass so that it overrides the inherited value.

okay I think I get it!! That was really helpful! ty!

1 Like

For the Animal and Cat example in the Inheritance IV lesson:

I wanted to create a new const variable bryceCatBehavior to store the incremented values from calling bryceCat.incrementBehavior();. The problem is, I am getting ‘undefined’ as a result instead of the incremented value which is 1 when I console log. Is this a local/global scope issue or have I lost connection to the parent class?

const bryceCatBehavior = bryceCat.incrementBehavior(); // Outputs “undefined” when console logged.

My intention is to see how many times the incrementBehavior method is getting called and possibly even store the values (this may or may not be a good idea to do so but I’m curious if the possibility exists).

None of the above! You’re assigning the result of a function call to bryceCatBehavior - note the parentheses in bryceCat.incrementBehavior(). (A method call to be specific, but same thing.)

When the method is called it runs the code in .incrementBehavior(). The problem here is that there’s no return value specified, it just increments the property and that’s it. When there’s no other return value, JS’s default return value is undefined. So undefined is returned and assigned to your variable, bryceCatBehavior.

For your purposes, since incrementBehavior increments by 1 for each call, you can see how many times it’s been called by simply const bryceCatBehavior = bryceCat.behavior;

If there wasn’t a one-to-one mapping, you could still capture how many times the method has been called by adding some code to it. Say we added another property to our Animals:

class Animal {
  constructor(name) {
    this._name = name;
    this._behavior = 0;
    this._timesMisbehaved = 0;
  }
  get timesMisbehaved() {
    return this._timesMisbehaved;
  }
  set timesMisbehaved(newValue) {
    this._timesMisbehaved = newValue;
  }
  // rest of class

then every time we run the method, we can have it add one to our count of behavior incidents.

incrementBehavior() {
    this.timesMisbehaved++;
    // rest of method
2 Likes

Hmm…for a while, I thought the variable bryceCatBehavior couldn’t be incremented and instead returns undefined by default because I used the const keyword but I don’t believe thats the case anymore. I did try to play around with the code and its just like you said for when there is no return…it only logs the property.

This seems right though but I have totally forgotten this, getters, setters so I’ll have to freshen up and get back to this example.

Thank you!

Is there any difference between

console.log(nurseOlynyk.name);
//Output: Olynyk

console.log(nurseOlynyk._name);
//Output: Olynyk

This also works with and without _ for remainingVacationDays, shouldn’t we suppose to follow what we wrote in the code?

backing variables (the variables that begin with an _) are not meant to be accessed directly. Use `console.log(nurseOlynyk.name) so that it uses your getter

I wrote:
console.log(nurseOlynyk._remainingVacationDays);

You see, _remainingVacationDays has _ in front of the “remainingVariableDays” which tells the code reviewer or other party of the same sort, that the property should not be directly accessed. Therefore a getter method is present in the object which when invoked would return the value of property that the original programmer did not want you to access directly.

The solution code specified:
console.log(nurseOlynyk.remainingVacationDays);

This invokes the getter method present in our object, "get remainingVacationDays(){ // return something } "

Hope that it helps.