2015-04-04 102 views
0

我的困惑從這個代碼片斷的最後一行莖:理解「靜態」的方法

function Animal(name) { 
    Animal.count = Animal.count+1||1;// static variables, use function name "Animal" 
    this.name = name; //instance variable, using "this" 
} 

Animal.showCount = function() {//static method 
    alert(Animal.count) 
} 

Animal.prototype.showName=function(){//instance method 
    alert(this.name); 
} 

var mouse = new Animal("Mickey"); 
var elephant = new Animal("Haddoop"); 

Animal.showCount(); // static method, count=2 
mouse.showName();//instance method, alert "Mickey" 
mouse.showCount();//Error!! mouse.showCount is not a function, which is different from Java 

問題:爲什麼不是mouse.showCount()的功能?

+2

因爲你把它放在** **動物對象上,而不是全部**動物對象。 – Tom 2015-04-04 14:35:48

回答

3

JavaScript沒有傳統意義上的靜態方法。你所做的就是將一個函數賦值爲另一個函數的屬性(構造函數)。請記住,函數是JS中的對象。

因此,從構造函數創建的對象實例和構造函數本身之間沒有直接關係。唯一的*關係在實例和構造函數的.prototype對象之間。

如果您要覆蓋構造函數的.prototype,那麼就不會有間接關係。所以基本上,構造函數只是作爲其.prototype與正在創建的新對象實例之間的臨時「匹配製造者」。之後,構造函數不起作用。


*的instanceof操作使得它看起來好像有一個連接,但它實際上只是在實例的原型鏈中的對象進行比較的構造的.prototype對象,所以它仍然是一個間接的關係,一個可以被打破。

+1

我想知道靜態方法的「傳統意義」是什麼......它對我來說永遠沒有意義,可以訪問實例上的類方法。 – Bergi 2015-04-04 14:39:04

+0

@Bergi:是的,我不是一個經典的面向對象的程序員,但我不認爲在那些環境中,靜態方法就像將一個函數分配給另一個函數的屬性一樣。這大部分是我所掌握的。 :-) – 2015-04-04 14:41:22

+0

@Bergi同意。在Java中,我認爲有一個原因可能是它是允許實例方法在不指定類名的情況下訪問相同類的靜態方法的「唯一」方法(因爲doFoo()等同於this.doFoo ()'這是實例訪問)。不是說它不能以不同的方式解決,而是關於我能想到的最好的論點...... – 2015-04-04 14:46:05