JS にはプライベートというものはありませんが、クロージャーを使用してスコープを操作できます。
たとえば、あなたの例ではvar1
、パブリック プロパティとして公開する必要はないとしましょう。次のようにコードを簡単に書き直すことができます。
function ctest() {
var var1 = "haha";
this.func1 = function() {
alert(var1);
func2();
alert(var1);
}
var func2 = function() {
var1 = "huhu";
}
}
func1
とは同じスコープを共有しているためfunc2
(同じ関数で定義されているため) ctest
、同じ変数にアクセスできます。もちろん、その場合はvar1
公開していないので、:myobj.var1
になりますundefined
。
プロパティとして公開する場合は、コンストラクターで作成したオブジェクト インスタンスにバインドvar1
する必要があります。 func2
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var func2 = function() {
this.var1 = "huhu";
}.bind(this);
}
それ以外の場合func2
は、別のコンテキスト オブジェクト ( this
) になります。ブラウザーがサポートしておらずbind
、シムを使用したくない場合 (上記のリンクを参照)、クロージャーを再び利用できます。
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var context = this;
var func2 = function() {
context.var1 = "huhu";
}
}
IMVHO はエレガントではありません。