Sky Walker
Sky Walker

Reputation: 1018

How can I call a method from a class without instantiating it?

If you look at a framework like cocos2d-x, for example:

cc.Sprite.extend();

Sprite here is a class; how can I call one of its methods without instantiating it with the new keyword?

For example, if I have this class:

var superClass = function(){
    
    this.init = function(){
        console.log("new class constructed !")
    };

};

To call init, I must do this:

obj = new superClass();
obj.init();

But how can I call the function without needing to instantiate the class?

Upvotes: 21

Views: 18151

Answers (3)

Giuseppe Pes
Giuseppe Pes

Reputation: 7912

ES6 and newer:

Use the static keyword. It's supported by most modern browsers.

class SuperClass {
   static init() {
     console.log("new class constructed !")
   }
}

SuperClass.init();

Older browsers:

There are different ways to achieve that. One option is to use an object literal.

Object literal:

var superClass = {
    init: function(){
        console.log("new class constructed !")
    }
};

superClass.init();

https://jsfiddle.net/ckgmb9fk/

However, you can still define an object using a function constructor and then add a static method to the "class". For example, you can do this:

var SuperClass = function(){};

SuperClass.prototype.methodA = function() {
    console.log("methodA");
};

SuperClass.init = function() {
    console.log("Init function");
}

SuperClass.init();

var sc = new SuperClass();
sc.methodA();

Note that the method init won't be available in the SuperClass instance object because it is not in the object prototype.

https://jsfiddle.net/mLxoh1qj/

Extending prototype:

var SuperClass = function(){};

  SuperClass.prototype.init = function() {
      console.log("Init");
  };

SuperClass.prototype.init();

var sc = new SuperClass();
sc.init();

https://jsfiddle.net/0ayct1ry/

This solution is useful if you want to access the function init both from the SuperClass prototype and from an object instance.

Upvotes: 29

mr mcwolf
mr mcwolf

Reputation: 2859

Use superClass as namespace.

superClass = {
    init: function() { 
    }
}

Upvotes: 0

Daniel Perez
Daniel Perez

Reputation: 6903

If you assign the method this way, you will not be able to call it without instanciating the class, but you can achieve this by extending the prototype:

var superClass = function(){
};

superClass.prototype.init = function(){
    console.log("new class constructed !")
};

var obj = new superClass();
obj.init();
superClass.prototype.init();

Upvotes: 1

Related Questions