Home > Back-end >  Sharing a function between different methods of class
Sharing a function between different methods of class

Time:01-10

Is there a way to declare a function inside class? If yes, I'm trying to declare function age() inside the class, but i think it is not possible on javascript or maybe I'm wrong.

I do not want to put it outside the class because the code looks more organized like this. What are the options available? Thank you. My code is below.

class Animal {
    constructor(name) {
      this.name = name;
    }

    cat() {
        console.log(`Meow! It is cat and his name is ${this.name}`);
        console.log(age('cat'));
    }

    dog() {
        console.log(`Au! It is dog and his name is ${this.name}`);
        console.log(age('dog'));
    }

    function age(animal){
        if(animal=='cat') return 7;
        if(animal=='dog') return 5;
    }

  }
  
  const fluffy = new Animal('Fluffy');
  fluffy.cat();

  const billy = new Animal('billy');
  billy.dog();

CodePudding user response:

You've already declared functions inside of the class, just do the same for age. To access it, you need to use this.age since JavaScript doesn't look for class instance variables/functions by default.

class Animal {
  constructor(name) {
    this.name = name;
  }

  cat() {
    console.log(`Meow! It is cat and his name is ${this.name}`);
    console.log(this.age('cat'));
  }

  dog() {
    console.log(`Au! It is dog and his name is ${this.name}`);
    console.log(this.age('dog'));
  }

  age(animal) {
    if (animal == 'cat') return 7;
    if (animal == 'dog') return 5;
  }

}

const fluffy = new Animal('Fluffy');
fluffy.cat();

const billy = new Animal('billy');
billy.dog();

CodePudding user response:

As others already said cat and dog are already functions of Animal (member functions).

If you don't want that the age function is a member function (belongs to an instance of Animal) you can make it static:

class Animal {
    constructor(name) {
      this.name = name;
    }

    cat() {
        console.log(`Meow! It is cat and his name is ${this.name}`);
        console.log(Animal.age('cat'));
    }

    dog() {
        console.log(`Au! It is dog and his name is ${this.name}`);
        console.log(Animal.age('dog'));
    }

    static age(animal){
        if(animal=='cat') return 7;
        if(animal=='dog') return 5;
    }

  }
  
  const fluffy = new Animal('Fluffy');
  fluffy.cat();

  const billy = new Animal('billy');
  billy.dog();

If you don't want to make it accessible outside of Animal than make it private:

class Animal {
    constructor(name) {
      this.name = name;
    }

    cat() {
        console.log(`Meow! It is cat and his name is ${this.name}`);
        console.log(Animal.#age('cat'));
    }

    dog() {
        console.log(`Au! It is dog and his name is ${this.name}`);
        console.log(Animal.#age('dog'));
    }

    static #age(animal){
        if(animal=='cat') return 7;
        if(animal=='dog') return 5;
    }

  }
  
  const fluffy = new Animal('Fluffy');
  fluffy.cat();

  const billy = new Animal('billy');
  billy.dog();

However having a private static function is rarely useful. The intent of a static method is that it logically belongs to the class but performs a task that does not require an instance of that class.

CodePudding user response:

Hi Jessica You can put it as a method if you want.

But I think anyway in this case you should have a class for cat and another one for dog.

Or pass in the constructor the age but it will mean that the age will not be related to what is the animal.

Long story short you can decide or to create a class for each or to create a method inside the class.

CodePudding user response:

You can create a function in a class, but the correct syntax requires you to omit the 'function' keyword. Also use this keyword to refer to the current object.

class Animal {

    constructor(name) {
      this.name = name;
    }

    cat() {
        console.log(`Meow! It is cat and his name is ${this.name}`);
        console.log(this.age('cat'));
    }

    dog() {
        console.log(`Au! It is dog and his name is ${this.name}`);
        console.log(this.age('dog'));
    }

    age(animal){
        if(animal=='cat') return 7;
        if(animal=='dog') return 5;
    }

  }
  
  const fluffy = new Animal('Fluffy');
  fluffy.cat();

  const billy = new Animal('billy');
  billy.dog();

CodePudding user response:

well I can come up with 3 way to define some functionality in a class

number one: method ,it is the common one that you are likely to see in class based codes

    class Animal{
                 //rest of  class
                 age(){
                      //your function goes here
                      }
}   

you can latter access it with an instance of class const cat = new Animal() cat.age() number two: static ,it is somewhat different because it belong to class itself

    class Animal{
                 //rest of  class
                static age(){
                      //your function goes here
                      }
}   

in this case you don't need to create an instance of class Animal.age() and lastly: treating your function as property it is not different from using method but I would recommend method if you want to use this functionality often there are minor differences in** memory usage** syntax goes like this

    class Animal {
constructor(name) {
  this.age= ()=>{//your function}
 }}

use age like this

 const cat = Animal()
 , {age} = cat
 age()
  • Related