19

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?

Pikamander2
  • 7,332
  • 3
  • 48
  • 69
Sky Walker
  • 978
  • 1
  • 9
  • 22
  • Take a look at https://stackoverflow.com/questions/9170332/how-is-this-possible-without-instantiating-new-ing-it-var-a-array-prototy – Kyll May 24 '15 at 09:11

3 Answers3

28

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.

Pikamander2
  • 7,332
  • 3
  • 48
  • 69
Giuseppe Pes
  • 7,772
  • 3
  • 52
  • 90
1

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();
Daniel Perez
  • 6,335
  • 4
  • 24
  • 28
0

Use superClass as namespace.

superClass = {
    init: function() { 
    }
}
mr mcwolf
  • 2,574
  • 2
  • 14
  • 27