1

Javascript で静的クラス変数をシミュレートしました。

MyObject.staticVariable = "hello world";

function MyObject() {
    // do something
}

MyObject.prototype.someFunction = function() ...

staticVariable プロパティを割り当てる前に MyObject を明示的に作成しないため (そして、どうすれば MyObject 関数を使用できるのでしょうか?)、この構文が機能する理由がわかりません。しかし、それは機能し、次のような質問に対する多くの回答でそれを見てきました:Javascriptで静的クラス変数をシミュレートするにはどうすればよいですか?

名前空間で MyObject 関数を宣言するときに、この機能を実現するにはどうすればよいですか?

var Namespace = {};

// Not allowed, and for good reason in my eyes, as NameSpace.MyObject does not exist
Namespace.MyObject.staticVariable = "hello world";

Namespace.MyObject = function() {
    // do something
}

Namespace.MyObject.prototype.someFunction = function() ...

明確にできるかどうか、および/または私の考えが間違っているかどうかを教えてください. ありがとう。

4

3 に答える 3

4

関数宣言は、現在のレキシカル環境の一番上に「持ち上げられ」ます。

これは、その環境で他のコードが実行される前に関数が存在することを意味します。

// This works

MyObject.staticVariable = "hello world";

function MyObject() {
    // do something
}

// This does not

MyObject.staticVariable = "hello world";

var MyObject = function() {
    // do something
}

あなたのNamespace例では、2番目の例と事実上同じです。これは、関数の割り当てが最初に行われることを確認する必要があることを意味します。

于 2012-10-24T15:56:14.983 に答える
0

静的クラス変数の意味を明確にしていただけますか? JavaScript は Java と同じではありません。

クライアントが変更できない定数が必要な場合は、クロージャーを使用できます。例えば:

var Namespace = {};
Namespace.MyObject = (function(){
  var staticVariable = "hello world";

  //this will be assigned to "MyObject"
  return {
    someFunction: function() {
       //refer to staticVariable here
       //no client can modify staticVariable directly; 
       //only through the methods you provide
    }
  };
})();
于 2012-10-24T16:02:25.157 に答える
0

関数宣言は巻き上げられます。つまり、インスタンス化の上で使用できます。ただし、関数はそうではありません。あなたの例では、これを行います:

Namespace.MyObject.staticVariable = "hello world";

Namespace.MyObject = function() {
    // do something
}

Namespace.MyObject関数宣言として作成されていない (作成できない)ため、これは機能しません。機能のシミュレーションに関しては、関数を使用します。

function add( prop, val ) {
    Namespace.MyObject[ prop ] = val;
}

これにより、オブジェクトを明示的に作成する前に、オブジェクトにプロパティを追加できます。

add( "staticVariable", "Hello World" );

Namespace.MyObject = function() {
    // do something
};
于 2012-10-24T15:57:55.743 に答える