2014-03-13 93 views
0

我的問題不在於對象的成員和原型成員之間的差異。我明白那個。我認爲它類似於C#對象成員和類中的靜態成員。原型對象和構造函數上的成員之間有什麼區別?

我的問題是關於原型對象上的構造函數和成員之間的差異。與C#相比,它們都是「靜態」的。那麼區別是什麼呢?我只觀察到,可以直接在實例上或在Constructor.prototype上調用原型成員的相同方式。構造函數成員只能在構造函數中調用。 何時使用哪種方法?

爲了說明這一點,假設我需要人數。


實施例使用構造函數成員:

function Person() { 
    Person.countOfCreatedPersons = (Person.countOfCreatedPersons || 0) + 1; 
} 

Person.Count = function() { 
    return Person.countOfCreatedPersons; 
} 

var p = new Person(); 
alert(Person.Count()); 

實施例使用原型成員:

function Person() { 
    Person.prototype.countOfCreatedPersons = (Person.prototype.countOfCreatedPersons || 0) + 1; 
} 

Person.prototype = { 
    Count: function() { 
     return this.countOfCreatedPersons; 
    } 
} 

var p = new Person(); 
alert(Person.prototype.Count()); // or p.Count() 
+0

可能重複的[類/靜態方法在JavaScript?](http://stackoverflow.com/questions/7694501/class-static-method-in-javascript) – zzzzBov

回答

0

當將屬性添加到一個對象的原型,每個對象從原型繼承的屬性有:

function Ob(){}; 

Ob.prototype.initialised = true; 

var ob1 = new Ob(); 
alert(ob1.initialised); //true! 
alert(Ob.initialised); //undefined; 

如果將它添加到構造函數中,就像是一個靜態屬性。 實例將無法​​訪問它們。

function Ob2(){}; 

Ob2.initialised = true; 
var ob2 = new Ob2(); 
alert(ob2.initialised); //undefined 
alert(Ob2.initialised); //true 

此外,如果你添加一個方法的原型,方法裏面的this變量將指向你的對象(你與new創建類的實例)。這是不正確的類方法

function Obj() { 
    this.value = 1; 
} 

Obj.prototype.getValue = function() { 
    return this.value; 
}; 

Obj.getValue = function() { 
    return this.value; 
}; 

var ob3 = new Obj(); 
alert(ob3.getValue()); //'1'! 
alert(Obj.getValue()); //undefined! 

希望這個解釋。

相關問題