2013-10-19 77 views
7

你好,堆垛機。如何訪問實例上的靜態成員?

這裏是代碼,我一直在掙扎幾個小時,想法是跟蹤有多少實例創建,但也有可能調用靜態方法和更改/更新靜態成員。還有類似的問題,但我不能解決我的問題。

// object constructor 
function Foo() { 
    this.publicProperty = "This is public property"; 
} 
// static property 
Foo.staticProperty = "This is static property"; 

// static method 
Foo.returnFooStaticProperty = function() { 
    return Foo.staticProperty; 
}; 


console.log("Static member on class: " + Foo.staticProperty); // This is static property 


console.log("Result of static method: " + Foo.returnFooStaticProperty()); //This is static property 

var myFoo = new Foo(); 
console.log("myFoo static property is: " + myFoo.staticProperty); // undefined 

爲了簡單起見,我在這裏更改了構造函數和成員名稱。我認爲很明顯發生了什麼事情。我希望構造函數對象和實例共享相同的靜態屬性。

我可以訪問構造函數對象上的靜態成員,但在實例中我沒有定義。

任何幫助,將不勝感激。

謝謝mor和aeoril。由於這個問題是本地化的,因此你們兩個的回答都能幫助我更好地理解原型遺傳。 P.S. JavaScript中沒有靜態成員這樣的東西,對象實例並不像我預期的那樣直接繼承它。這就是原型魔法。 感謝

回答

6

編輯:我重讀你的問題,而這個代碼解決如說您的實際問題:

的JavaScript:

function Foo() { 
    this.publicProperty = "This is public property"; 
    Object.getPrototypeOf(this).count++; 
} 
Foo.prototype.count = 0; 

console.log(new Foo().count, new Foo().count, Foo.prototype.count); 

FIDDLE

儘管如果對象被釋放垃圾收集,但不會自動遞減計數,但您可以使用刪除然後手動遞減。

+0

是的,我現在已經看到了。要點是我在對象構造函數和它的實例之間共享相同的變量,但也能夠在對象構造函數上運行靜態方法或方法。並且在最後的日誌調用中,實例的staticProperty是未定義的。 –

+1

我發現myFoo.staticProperty是日誌故意不確定的說明,如果沒有像myFoo.returnFooStaticProperty一個「雜牌」功能()我不認爲你可以從實例對象訪問靜態成員。 「kludge」函數可以工作,但是你能解釋爲什麼要共享類和它的實例之間的靜態變量嗎?也許重新思考它在原型(和繼承)方面的工作方式會是有利可圖的? – Aeoril

+0

是的,正如我所提到的原型方法有時讓我感到困惑。要點是靜態成員在所有實例和類/構造函數本身之間共享,但它的值存儲在一個地方,這意味着對象實例不會繼承該值。這就是原型出現的地方。你和mors的唯一區別就是我需要調用構造函數的方法。 –

5

您可以嘗試通過構造

console.log(myFoo.constructor.staticProperty); 
+1

這種情況到底發生了什麼?我是否指出myFoo的構造函數是Foo,因爲靜態屬性綁定到構造函數Foo? –

+0

這工作在爲我打字+ Webpack構建。 – Learner

2

JavaScript是基於原型以訪問靜態屬性。換句話說,一個對象的所有實例共享相同的原型。然後,您可以使用這臺樣機把靜態共享屬性:

function Foo() { 
    this.publicProperty = "This is public property"; 
} 

Foo.prototype.staticProperty = "This is static property"; 

var myFoo = new Foo(); 
console.log(myFoo.staticProperty); // 'This is static property' 

Foo.prototype.staticProperty = "This has changed now"; 
console.log(myFoo.staticProperty); // 'This has changed now' 
+0

但是在這種情況下,Foo()對象構造了一個靜態成員。 –

+0

@AlanKis,它沒有。你總是可以使用'this.prototype.staticProperty'來引用它。 – mor

+0

是的,你是對的。 JS OOP方法有時讓我困惑。 –