简体   繁体   中英

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?

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.

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();

Use superClass as namespace.

superClass = {
    init: function() { 
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM