私がこれを正しく理解した場合、関数に渡される場合を除いて、オブジェクトをオブジェクトとして動作させる必要がありますか?この例の変数はオブジェクトであるため、どこかで参照されたときにseven
単純に戻る方法はありません。7
さらに、num
本質的にはプライベート変数です。ですから、トリックを使ってfor...in
もJSON.stringify
何の役にも立ちません。あなたがすべきことは、num
変数をオブジェクトプロパティにするか(this.num
)、メンバー関数を作成することです(this.getNum(){return num};
)。
その後、プロパティ/メソッドを自由に使用できます。
alert(seven.num);//alerts 7, but requires num to be declared as a property
alert(seven.getNum());//alerts 7, requires the method
この場合、この関数をコンストラクターと通常の関数の両方として使用していることは明らかなので、メソッドを使用することをお勧めします(これは、追加するかもしれませんが、あまり良い考えではありません)。
少し衒学的な注意:コンストラクターの最初の文字を大文字にするのが習慣であり、JSネイティブ型(文字列、数値、オブジェクト、関数など)と衝突する可能性のある名前は使用しないでください。
function MyNumber(n)
{
this.num = n;//as a property
this.add = function(x)
{
return this.num + x;
}
}
var seven = new MyNumber(7);
alert(seven.num);//alerts 7
ただし、numを変更しない場合は、ここではそうだと思いますが、追加の関数は、次のルートを使用します。
function MyNumber(n)
{
var num = n;
this.add = function(x)
{
return num + x;
};
this.getNum = function()
{
return num;
};
}
alert(seven.getNum());
コンストラクターを通常の関数として使用することをまだ計画している場合は、関数/コンストラクターがどのように呼び出されたかを確認するのが最善です。
function MyNumber(n)
{
var num = n;
if (!(this instanceof MyNumber))
{//not called as constructor
return num;//or a function, or something else (treat this as a closure)
}
//Same code as above goes here
}
ここでは少し話題から外れるかもしれませんが、JavaScriptのクロージャー、オブジェクト、コンストラクターについて読みたいと思わずにはいられません。