你好,堆垛機。如何訪問實例上的靜態成員?
這裏是代碼,我一直在掙扎幾個小時,想法是跟蹤有多少實例創建,但也有可能調用靜態方法和更改/更新靜態成員。還有類似的問題,但我不能解決我的問題。
// 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中沒有靜態成員這樣的東西,對象實例並不像我預期的那樣直接繼承它。這就是原型魔法。 感謝
是的,我現在已經看到了。要點是我在對象構造函數和它的實例之間共享相同的變量,但也能夠在對象構造函數上運行靜態方法或方法。並且在最後的日誌調用中,實例的staticProperty是未定義的。 –
我發現myFoo.staticProperty是日誌故意不確定的說明,如果沒有像myFoo.returnFooStaticProperty一個「雜牌」功能()我不認爲你可以從實例對象訪問靜態成員。 「kludge」函數可以工作,但是你能解釋爲什麼要共享類和它的實例之間的靜態變量嗎?也許重新思考它在原型(和繼承)方面的工作方式會是有利可圖的? – Aeoril
是的,正如我所提到的原型方法有時讓我感到困惑。要點是靜態成員在所有實例和類/構造函數本身之間共享,但它的值存儲在一個地方,這意味着對象實例不會繼承該值。這就是原型出現的地方。你和mors的唯一區別就是我需要調用構造函數的方法。 –