2012-03-01 12 views
2

私は以下の設定をしています。メソッドとメソッドの両方がクラスStudentのパブリックメソッドです。しかし、なぜ唯一の「方法」アクセスプライベート変数pJavaScriptのプライベートメンバーはパブリックメソッドでアクセスできません

​function Student() { 
    var p = 10; 
    this.method = function() { 
     document.write(p); 
    }; 
}; 

Student.prototype.method1 = function() { 
    document.write('here'); 
    document.write(p); 
}; 

var s = new Student(); 
s.method(); 
s.method1(); 
​ 

どのようにそれが意味を成してないCA、私が意味する、それは「プライベートメンバーにアクセスすることはできませんパブリックメソッド!」です

答えて

4

JavaScriptのプロトタイプ継承には魔法はありません。

Studentはまだ関数であり、pはその関数のローカルです。それは決して外部コードからアクセスすることはできません。 methodは、Studentの内部で定義されているため、method1Studentのスコープ外と宣言されているため、pにアクセスできます。

別の関数のプロトタイプに関数を割り当てることで、そのローカル変数にアクセスすることはできません。

この例を考えてみましょう:

var p = 41; 

function foo() { 
    console.log(p); 
} 

​function Student(){ 
    var p = 10; 
}; 

Student.prototype.bar = foo; 

var s = new Student(); 
s.bar(); 
foo(); 

あなたはfooがオブジェクトのメソッドとして呼び出されるので、それはローカル変数にアクセスすることができると思うかもしれないが、それは単にケースではありません。動的に決定される唯一の値はthisです。これは特別なキーワードです。他のすべての変数は、スコープチェーンを通じて厳密に定義されています。

0

method1は、Studentの基本クラス定義の外で定義されています。したがって、基本クラス定義内でprivateとして宣言された変数にはアクセスできません。可能であれば、そのクラスのパブリックメソッドを定義するだけで、既存のクラスのプライベート変数の制限を回避することができます。

0

JavaScriptでは、method1などのパブリックメソッド(つまり、プロトタイプに追加されたメソッド)はプライベート変数にはアクセスできませんが、methodなどの「特権」メソッドはアクセスできません。

JavaScriptは他のオブジェクト指向言語と同じスコープ規則を持っていないことに注意してください。 methodメソッドは、Studentコンストラクタ関数内のプライベート変数の周りにクロージャを形成しますが、method1は含みません。

+1

幻のダウンドリートが再び襲います! – FishBasketGordo

+0

私にも来てください。世界で最も匿名のトロール? –

+0

@BenBarden、心配しないでください。何も問題はないので、私はあなたの答えをupvotedしました! – series0ne

関連する問題