Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
423 views
in Technique[技术] by (71.8m points)

javascript - 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...