从类调用方法而不实例化它

时间:2015-05-24 09:07:48

标签: javascript oop

我会尽力说清楚 如果你看一下像cocos2d-x这样的框架

cc.Sprite.extend();

这里的Sprite是类,我们可以调用方法而不用new关键字

实例化它

我有一个班级,例如

var superClass = function(){

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

};

调用init我必须这样做

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

但是如何在不实例化的情况下引用类的方法

3 个答案:

答案 0 :(得分:9)

基本上你想要的是静态方法。有不同的方法来实现这一目标。我认为,使用对象文字会更容易为你做。

对象litteral

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

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

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/

如果要从init原型和对象实例访问函数SuperClass,此解决方案很有用。

<强> ES6:

这在ES6中更好

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

SuperClass.init();

答案 1 :(得分:1)

如果你以这种方式分配方法,你将无法在没有实例化的情况下调用它,但你可以通过扩展原型来实现这一点:

var superClass = function(){
};

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

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

答案 2 :(得分:0)

使用superClass作为命名空间。

superClass = {
    init: function() { 
    }
}