如何在不实例化类的情况下调用一个类中的方法?

19

如果你看一下像cocos2d-x这样的框架:

cc.Sprite.extend();

这里的Sprite是一个类;如果我不想使用new关键字实例化它,该如何调用其中的一个方法呢?

比如说,如果我有这个类:

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

};

要调用init,我必须这样做:

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

但是我如何在不需要实例化类的情况下调用该函数?


请查看 https://stackoverflow.com/questions/9170332/how-is-this-possible-without-instantiating-new-ing-it-var-a-array-prototy - Kyll
3个回答

28

ES6及更高版本:

使用static关键字。它被大多数现代浏览器支持。

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

SuperClass.init();

旧版浏览器:

有不同的方法可以实现。其中一种选择是使用对象字面量。

对象字面量

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

superClass.init();

https://jsfiddle.net/ckgmb9fk/

然而,您仍然可以使用函数构造器定义一个对象,然后将静态方法添加到“类”中。例如,您可以这样做:

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

请注意,init方法在SuperClass实例对象中不可用,因为它不在对象原型中。

https://jsfiddle.net/mLxoh1qj/

扩展原型:
var SuperClass = function(){};

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

SuperClass.prototype.init();

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

https://jsfiddle.net/0ayct1ry/

如果您想从SuperClass原型和对象实例中访问函数init,则此解决方案非常有用。


1
如果您按照这种方式分配方法,则无法在未实例化类的情况下调用它,但是您可以通过扩展原型来实现此功能:
var superClass = function(){
};

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

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

0

使用superClass作为命名空间。

superClass = {
    init: function() { 
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接