2014-02-12 40 views
1

有沒有辦法在JavaScript類的每個實例中創建某種類型的變量(沒有全局變量)?JavaScript類的所有實例中的變量相同

例如:

function Class(){ 
    this.foo = 'bar'; 
    this.setText = setText; 
    this.getText = getText; 
} 

function setText(value){ 
    this.foo = value; 
} 

function getText(){ 
    alert(this.foo); 
} 

現在,我創建同一類的兩個實例,像這樣:

​​3210

當我更改類水果foo的值我也希望它是在食品雜貨中改變。

fruit.setText("apple"); 
fruit.getText(); //alerts apple 
groceries.getText(); //SHOULD also alert apple 

我動態創建一個類的實例,他們沒有一個明確的變量名(水果,雜貨)像例子。

謝謝!

+1

可能重複的[JavaScript中的靜態變量](http://stackoverflow.com/questions/1535631/static-variables-in-javascript) – asawyer

回答

9

是的,但是絕對,只是使用功能上本身的屬性:

Class.text = 'apple' 

Class.prototype.getText = function() { return Class.text; } 
Class.prototype.setText = function (text) { Class.text = text; } 
+0

考慮到'Class'是函數內部的'this',爲什麼不傳遞'this.text'? (除非有人瘋了才能做'.bind') –

+1

@GonçaloVieira那是不正確的。 'this'不是函數內的'Class',它是由'Class'構造的對象。 'this.text'不起作用,它將特定於對象,不在對象的所有實例中共享。 – meagar

+0

完美,效果很棒!謝謝! – Ood

1

另一種方法,使用封閉:在這種情況下

var Class = (function() { 
    var foo = "bar"; 

    function Class(){ 
     this.setText = setText; 
     this.getText = getText; 
    } 

    function setText(value){ 
     foo = value; 
    } 

    function getText(){ 
     alert(foo); 
    } 

    return Class; 
}()); 

var fruit = new Class(); 
var groceries = new Class(); 

foo將類似於一個私人靜態屬性,這是從外面不可用。

+0

這有一個明顯更昂貴的缺點,每次構建一個類時,該類都會獲得自己獨特的一組方法,每個實例都需要額外的處理時間和內存。 – meagar

+0

@meagar我剛剛從OP複製代碼。他以這種方式建造了他的班級。當然,他應該使用'prototype',但那不是問題。所以我認爲我堅持這個關鍵部分,這是關於靜態屬性的問題。 – basilikum

相關問題