JS: Running methods from the constructor and not using object again












0















I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog like this:



class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}


When I create a new object that is an instance of the Dog class, I always need to call bark() and sayName(). When doing this, is it advised to call these methods from the constructor like this:



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


or is it better to call them outside after initializing the object like this:



let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();


Note: I never need to use bark() and sayName() after doing this. It's only a one time thing.



So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.










share|improve this question























  • In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.

    – frontend_dev
    Nov 20 '18 at 20:57











  • I think the question is on the fringe of being opinion-based, but if the bark and say only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.

    – Mark Meyer
    Nov 20 '18 at 20:58













  • It's also not clear why this needs to be an object.

    – Barmar
    Nov 20 '18 at 21:32
















0















I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog like this:



class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}


When I create a new object that is an instance of the Dog class, I always need to call bark() and sayName(). When doing this, is it advised to call these methods from the constructor like this:



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


or is it better to call them outside after initializing the object like this:



let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();


Note: I never need to use bark() and sayName() after doing this. It's only a one time thing.



So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.










share|improve this question























  • In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.

    – frontend_dev
    Nov 20 '18 at 20:57











  • I think the question is on the fringe of being opinion-based, but if the bark and say only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.

    – Mark Meyer
    Nov 20 '18 at 20:58













  • It's also not clear why this needs to be an object.

    – Barmar
    Nov 20 '18 at 21:32














0












0








0








I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog like this:



class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}


When I create a new object that is an instance of the Dog class, I always need to call bark() and sayName(). When doing this, is it advised to call these methods from the constructor like this:



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


or is it better to call them outside after initializing the object like this:



let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();


Note: I never need to use bark() and sayName() after doing this. It's only a one time thing.



So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.










share|improve this question














I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog like this:



class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}


When I create a new object that is an instance of the Dog class, I always need to call bark() and sayName(). When doing this, is it advised to call these methods from the constructor like this:



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


or is it better to call them outside after initializing the object like this:



let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();


Note: I never need to use bark() and sayName() after doing this. It's only a one time thing.



So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.







javascript design-patterns software-design






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 20 '18 at 20:54









Yang KYang K

779




779













  • In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.

    – frontend_dev
    Nov 20 '18 at 20:57











  • I think the question is on the fringe of being opinion-based, but if the bark and say only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.

    – Mark Meyer
    Nov 20 '18 at 20:58













  • It's also not clear why this needs to be an object.

    – Barmar
    Nov 20 '18 at 21:32



















  • In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.

    – frontend_dev
    Nov 20 '18 at 20:57











  • I think the question is on the fringe of being opinion-based, but if the bark and say only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.

    – Mark Meyer
    Nov 20 '18 at 20:58













  • It's also not clear why this needs to be an object.

    – Barmar
    Nov 20 '18 at 21:32

















In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.

– frontend_dev
Nov 20 '18 at 20:57





In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.

– frontend_dev
Nov 20 '18 at 20:57













I think the question is on the fringe of being opinion-based, but if the bark and say only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.

– Mark Meyer
Nov 20 '18 at 20:58







I think the question is on the fringe of being opinion-based, but if the bark and say only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.

– Mark Meyer
Nov 20 '18 at 20:58















It's also not clear why this needs to be an object.

– Barmar
Nov 20 '18 at 21:32





It's also not clear why this needs to be an object.

– Barmar
Nov 20 '18 at 21:32












2 Answers
2






active

oldest

votes


















1















Is it advised to call these methods from the constructor




No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new calls only for running a procedure and then throwing away the object are an antipattern.



I would recommend to instead introduce a static method:



class Dog {


static fastLife(name) {
const dog = new this(name);
dog.bark();
dog.sayName();
// dog dies
}
}

Dog.fastLife("german shepard");



… and not using object again




Taken to the extreme, why do you need a class at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.



function fastLivedDog(name) {
function bark() {
console.log(`Bark Bark - ${name}`);
}
function sayName() {
console.log(`My name is ${name}`);
}
// in this example, the local functions are called only once
// and could be trivially inlined…
bark();
sayName();
}

fastLivedDog("german shepard");





share|improve this answer































    0














    Want to add what Bergi wrote.



    If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.



    function hashDogName(name) { return name.split('').reverse().join(''); }


    Please, do not write such a thing, I wrote this mess to show, that function returns other string



    And in your constructor you will use it:



    class Dog {
    constructor(name) {
    this.hashedName = this.hashDogName(name);
    }
    }


    So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
    I can't see any other cases why you should use class functions in constructor
    (except for logs).






    share|improve this answer























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53401364%2fjs-running-methods-from-the-constructor-and-not-using-object-again%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1















      Is it advised to call these methods from the constructor




      No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new calls only for running a procedure and then throwing away the object are an antipattern.



      I would recommend to instead introduce a static method:



      class Dog {


      static fastLife(name) {
      const dog = new this(name);
      dog.bark();
      dog.sayName();
      // dog dies
      }
      }

      Dog.fastLife("german shepard");



      … and not using object again




      Taken to the extreme, why do you need a class at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.



      function fastLivedDog(name) {
      function bark() {
      console.log(`Bark Bark - ${name}`);
      }
      function sayName() {
      console.log(`My name is ${name}`);
      }
      // in this example, the local functions are called only once
      // and could be trivially inlined…
      bark();
      sayName();
      }

      fastLivedDog("german shepard");





      share|improve this answer




























        1















        Is it advised to call these methods from the constructor




        No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new calls only for running a procedure and then throwing away the object are an antipattern.



        I would recommend to instead introduce a static method:



        class Dog {


        static fastLife(name) {
        const dog = new this(name);
        dog.bark();
        dog.sayName();
        // dog dies
        }
        }

        Dog.fastLife("german shepard");



        … and not using object again




        Taken to the extreme, why do you need a class at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.



        function fastLivedDog(name) {
        function bark() {
        console.log(`Bark Bark - ${name}`);
        }
        function sayName() {
        console.log(`My name is ${name}`);
        }
        // in this example, the local functions are called only once
        // and could be trivially inlined…
        bark();
        sayName();
        }

        fastLivedDog("german shepard");





        share|improve this answer


























          1












          1








          1








          Is it advised to call these methods from the constructor




          No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new calls only for running a procedure and then throwing away the object are an antipattern.



          I would recommend to instead introduce a static method:



          class Dog {


          static fastLife(name) {
          const dog = new this(name);
          dog.bark();
          dog.sayName();
          // dog dies
          }
          }

          Dog.fastLife("german shepard");



          … and not using object again




          Taken to the extreme, why do you need a class at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.



          function fastLivedDog(name) {
          function bark() {
          console.log(`Bark Bark - ${name}`);
          }
          function sayName() {
          console.log(`My name is ${name}`);
          }
          // in this example, the local functions are called only once
          // and could be trivially inlined…
          bark();
          sayName();
          }

          fastLivedDog("german shepard");





          share|improve this answer














          Is it advised to call these methods from the constructor




          No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new calls only for running a procedure and then throwing away the object are an antipattern.



          I would recommend to instead introduce a static method:



          class Dog {


          static fastLife(name) {
          const dog = new this(name);
          dog.bark();
          dog.sayName();
          // dog dies
          }
          }

          Dog.fastLife("german shepard");



          … and not using object again




          Taken to the extreme, why do you need a class at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.



          function fastLivedDog(name) {
          function bark() {
          console.log(`Bark Bark - ${name}`);
          }
          function sayName() {
          console.log(`My name is ${name}`);
          }
          // in this example, the local functions are called only once
          // and could be trivially inlined…
          bark();
          sayName();
          }

          fastLivedDog("german shepard");






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 20 '18 at 22:36









          BergiBergi

          376k61571901




          376k61571901

























              0














              Want to add what Bergi wrote.



              If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.



              function hashDogName(name) { return name.split('').reverse().join(''); }


              Please, do not write such a thing, I wrote this mess to show, that function returns other string



              And in your constructor you will use it:



              class Dog {
              constructor(name) {
              this.hashedName = this.hashDogName(name);
              }
              }


              So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
              I can't see any other cases why you should use class functions in constructor
              (except for logs).






              share|improve this answer




























                0














                Want to add what Bergi wrote.



                If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.



                function hashDogName(name) { return name.split('').reverse().join(''); }


                Please, do not write such a thing, I wrote this mess to show, that function returns other string



                And in your constructor you will use it:



                class Dog {
                constructor(name) {
                this.hashedName = this.hashDogName(name);
                }
                }


                So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
                I can't see any other cases why you should use class functions in constructor
                (except for logs).






                share|improve this answer


























                  0












                  0








                  0







                  Want to add what Bergi wrote.



                  If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.



                  function hashDogName(name) { return name.split('').reverse().join(''); }


                  Please, do not write such a thing, I wrote this mess to show, that function returns other string



                  And in your constructor you will use it:



                  class Dog {
                  constructor(name) {
                  this.hashedName = this.hashDogName(name);
                  }
                  }


                  So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
                  I can't see any other cases why you should use class functions in constructor
                  (except for logs).






                  share|improve this answer













                  Want to add what Bergi wrote.



                  If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.



                  function hashDogName(name) { return name.split('').reverse().join(''); }


                  Please, do not write such a thing, I wrote this mess to show, that function returns other string



                  And in your constructor you will use it:



                  class Dog {
                  constructor(name) {
                  this.hashedName = this.hashDogName(name);
                  }
                  }


                  So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
                  I can't see any other cases why you should use class functions in constructor
                  (except for logs).







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 20 '18 at 23:12









                  NikitaNikita

                  614




                  614






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53401364%2fjs-running-methods-from-the-constructor-and-not-using-object-again%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Guess what letter conforming each word

                      Port of Spain

                      Run scheduled task as local user group (not BUILTIN)