0

jsに1つのプライベート変数を持つ単純なオブジェクトがあると仮定します。

function test(){
var value=true;
}

そして今、私は1つのインスタンスを作成したいと思います:

var r=new test() //I want to get r === true

どうすればそこから値を返すことができますか?

私が書いた場合:

function test(){
var value=true;

return value;
}

結果としてテスト{}があります。

私が書いた場合:

function test(){
var value=true;

return function(){ return value; } 
}

次に、値を取得できますが、括弧を追加する必要があります。

var r = new test()()// r === true

かっこは必要ないので、コードを次のように変更しようとしました。

function test(){
var value=true;

return (function(){ return value; } )();
}

しかし、それに応じて、再びテスト{}を取得します。この状況でreturnステートメントを作成するにはどうすればよいですか?

4

3 に答える 3

4

私はあなたが次のようなことをする必要があると信じています:

function test(){
    this.value = true;
}

その後

var r=new test();
if (r.value == true) {
    //Do something
}
于 2012-09-03T13:26:43.630 に答える
3

まず、考えられる誤解を明確にする義務があると感じています。

function test(){
    var value=true;
}

プライベート変数を持つオブジェクトではありません。ローカル変数を持つ関数です。を使用して関数を呼び出すと、newプロパティのない関数のプロトタイプから継承するオブジェクトが作成されます。関数を通常どおりに呼び出すと、関数本体が実行されて戻りますundefined(何も返さないため)。


ソリューション:

実際にコンストラクター関数が必要ですか?あなたの例はとても単純なので、私は尋ねています。true明らかに、関数に2つの値とオブジェクトを返すようにすることはできません。

newしたがって、 :なしで関数を呼び出すことができます。

function test() {
    var value = true;
    return value;
}

var r = test();

本当になりたいのならrtrueコンストラクター関数として関数を呼び出す理由はありません。

結果として得test {}られた理由は、で関数を呼び出したためですnew。これを行うと、関数は常にオブジェクトを返します。明示的に返さない場合(valueオブジェクトではなくブール値)、暗黙的にthis(オブジェクト)を返します。
繰り返しになりますが、関数の内部から本当にr等しくなりたい場合valueは、単に。を使用して関数を呼び出さないでくださいnew


ただし、オブジェクトが必要な場合は、いくつかの方法があります。

PokeHerOneが回答で示したように、プロパティに値を割り当ててアクセスするか、papaiatisが 示すようにその値を返す関数を追加することができます。利点は、値が明示的にアクセスされ、コードを見ている他の人が何が起こっているのかを理解できることです。

さらに、その値/オブジェクトで何をしたいかに応じて、valueOfさまざまな演算子によって呼び出されるメソッドを実装できます。

例えば:

function Test(){
    var value = true;

    this.valueOf = function() {
        return value;
    }
}

var t = new Test();
console.log(t);          // logs the Test instance
console.log(t == true);  // logs `true`

つまりt、オブジェクトですが、さまざまな操作で値truevalue)のように動作します。これは強力ですが、型変換はやや暗黙的であり、JavaScriptで頻繁に使用されるものではないため、非常に混乱する可能性があります。

于 2012-09-03T13:34:49.267 に答える
0

内部で定義された使用済みメソッド:

function TestClass(){
    var value = true;
    this.getValue = function(){
        return value;
    };
}

var t = new TestClass();
alert(t.getValue()); // true

valueはプライベートとして定義されているため、外部からアクセスすることはできません。

alert(t.value) // undefined
于 2012-09-03T13:30:28.563 に答える