Ryan Sampson
Ryan Sampson

Reputation: 6817

JavaScript class - Call method when object initialized

I have a class similar to the one below. How do I call my init method when the object is created? I don't want to have to create an instance of my object then call initialize like I do below.

var myObj = new myClass(2, true);
myObj.init();

function myClass(v1, v2) 
{
    // public vars
    this.var1 = v1;

    // private vars
    var2 = v2;

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // private methods
    someMethod = function() {
        // do some private stuff
    };
}

Upvotes: 32

Views: 79278

Answers (6)

Piyush Duggal
Piyush Duggal

Reputation: 11

you could do something like this:

class MyClass {
this.v1 = "hello";

init = () => {
// do something
  }

constructor(){
  this.init()
  }

}

Upvotes: 1

Ivan
Ivan

Reputation: 40708

JavaScript classes introduced in ECMAScript 2015 are primarily syntactical sugar over JavaScript's existing prototype-based inheritance. The class syntax is not introducing a new object-oriented inheritance model to JavaScript. JavaScript classes provide a much simpler and clearer syntax to create objects and deal with inheritance.

- MDN web docs

When using this syntax, because only the constructor() method is run on instantiation you can't auto-instantiate an object. You always have to add user = new MyUser()

var user;

class MyUser {
  constructor(var1, var2) {

    this.var1 = var1;
    this.var2 = var2;

  }

  static staticMethod() {

    // accessed directly with the class name `MyUser`

  }

  instanceMethod() {

    // accessed with object instance
return true
  }

}

user = new MyUser('hey','there')

Upvotes: 3

Kunok
Kunok

Reputation: 8759

There is even more smooth way to do this:

this.init = function(){
  // method body
}();

This will both create method and call it.

Upvotes: 12

jbeard4
jbeard4

Reputation: 12811

See below for one possible answer, and some corrections to your code.

function myClass(v1, v2) 
{
    // public vars
    this.var1 = v1;

    // private vars
    // use var to actually make this private
    var var2 = v2;

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // private methods
    // this will be private as though it had been declared with var
    function someMethod() {
        // do some private stuff
    };

    //call init
    this.init();
}

Upvotes: 3

harpo
harpo

Reputation: 43168

Just add

this.init();

to your myClass function.

Upvotes: 1

Daniel Earwicker
Daniel Earwicker

Reputation: 116714

NB. Constructor function names should start with a capital letter to distinguish them from ordinary functions, e.g. MyClass instead of myClass.

Either you can call init from your constructor function:

var myObj = new MyClass(2, true);

function MyClass(v1, v2) 
{
    // ...

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // ...

    this.init(); // <------------ added this
}

Or more simply you could just copy the body of the init function to the end of the constructor function. No need to actually have an init function at all if it's only called once.

Upvotes: 45

Related Questions