2015-05-24 83 views
3

我會盡量說清楚,因爲我可以 如果你看看喜歡的cocos2d-x例如框架調用方法時

cc.Sprite.extend(); 

這裏雪碧是一流的,我們怎麼能叫方法,無需實例化它new關鍵字

我有例如一類

var superClass = function(){ 

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

}; 

調用初始化我必須這樣做

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

,但我怎麼能引用方法的類沒有實例它

+0

看看https://stackoverflow.com/questions/9170332/how-is-this-possible-without-instantiating-new-ing-it-var-a-array-prototy –

回答

7

基本上你想要的是一個靜態方法。有不同的方法來實現這一點。我認爲,使用對象字面值會更容易爲你做。

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

注意,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都該解決方案是非常有用的。

ES6:

這是ES6

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

SuperClass.init(); 
1

如果這樣分配的方法,你就不能稱之爲不instanciating類,但你可以通過擴展實現這一目標原型:

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() { 
    } 
}