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 はエレガントではありません。