2013-10-19 11 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.P. Javascriptに静​​的メンバーがないので、オブジェクトインスタンスは私が期待したとおりに直接インスタンスを継承しません。これがプロトタイプの魔法です。 おかげ

答えて

6

EDIT:あなたは、静的共有の性質を置くために、このプロトタイプを使用することができます

は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

はい、私は今それを見ました。ポイントは、オブジェクトのコンストラクタとそのインスタンス間で同じ変数を共有していることですが、静的メソッドまたはオブジェクトコンストラクタでメソッドを実行できることもあります。また、最後のログ呼び出しで、instanceのstaticPropertyは未定義です。 –

+1

myFoo.staticFontStaticPropertyは、myFoo.returnFooStaticProperty()のような "kludge"関数がなければ、インスタンスオブジェクトから静的メンバーにアクセスすることはできないと説明するために、ログにmyFoo.staticPropertyが定義されていないことを示しました。 "kludge"関数は機能しますが、クラスとそのインスタンスの間で静的変数を共有する理由を説明できますか?プロトタイプ(および継承)を使って動作する方法を念頭に置いて考えることは有益でしょうか? – Aeoril

+0

はい、私はプロトタイプのアプローチが時々私を混乱させると述べた。ポイントは、静的メンバーはすべてのインスタンスとクラス/コンストラクタ関数自体の間で共有されますが、値は1か所に格納されます。つまり、オブジェクトインスタンスはその値を継承しません。それがプロトタイプが現れる場所です。私とあなたの違いは、コンストラクタ関数のメソッドを呼び出す必要があるということだけです。 –

5

あなたはJavascriptがプロトタイプベースで

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

この場合、どういうことが起こっていますか?静的なプロパティがコンストラクタ関数Fooにバインドされているので、myFooのコンストラクタがFooであることを指していますか? –

+0

これは私のためにTypescript + Webpackビルドで動作しました。 – Learner

2

コンストラクタを介して静的プロパティへのアクセスを取得しようとすることができます。つまり、オブジェクトのすべてのインスタンスが同じプロトタイプを共有します。私はあなたの質問を再読み込み、およびこのコードが述べたように、あなたの実際の問題解決:

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のアプローチは時々私を混乱させる。 –