2009-07-12 11 views
1

私は、プライベート変数を使用する既存のオブジェクトにメソッドを適用しようとしています。オブジェクトは、そのように設定され:javascriptのオブジェクト変数とプライベート変数にメソッドを適用する

function a(given_id) 
{ 
    var id= given_id; 
} 

は、今私はそう

my_obj = new a('some_id'); 
my_obj.myMethod = function(){ 
    alert(id); 
} 

のようにそれにいくつかの新しい方法を適用したい今、私はmy_obj.myMethod()に行く場合、私はidが定義されていないというエラーを取得します。 私はIDを公開から公開に変更する場合、この同じコードが機能します。

myMethodが元々特権メソッドとして定義されていれば、これが機能するため、なぜこのようなことが起こっているのか分かりません。私が考えることができるのは、myMethodが特権的なメソッドではなく、publicメソッドとして追加されていることだけです。

これに関する情報は非常に高く評価されます。

答えて

2

var id = ...の代わりにthis.id = ...を使用します(varは関数スコープにのみローカル変数を与えます)。

{編集}試みる:

function Foo(givenId) 
{ 
    var id = givenId; 

    this.Bar = function() { 
     WScript.Echo(id); //change this to alert(...) 
     } 
} 

var foo = new Foo(52); 
foo.Bar(); 

再び、機能にvarが関数スコープ(ローカル変数)を有しています。アクセス権を持っている場合は、特権関数を外部関数の内部関数として宣言し、クロージャを使用してそれにアクセスします。

+0

はい私はそれが(上記のように)それを修正することがわかっていますが、id変数を非公開にしたいと思います。 var idは特権メソッドからアクセス可能でなければなりません。オブジェクトにそれを適用しながら特権として宣言する方法はありますか? – Ori

+0

答えをインラインで編集します。 –

+0

はい、これはFooにBarを追加しようとしている以外は機能します。つまり、私はfoo.Bar = function(){....}のようなことをしなければならないということを意味します。 この構文を使用して、どのように特権として宣言しますか? 返信ありがとう – Ori

0

あなたは私的な変数の考え方を誤解していると思います。あなたがやろうとしているのは、保護されているprivate varにアクセスすることですが、JSオブジェクトには保護された変数はありません。宣言の外側にあるオブジェクトを変更する場合、それは祖先として扱われます。

+0

あなたがプライベート変数を持っていて、それを返そうとしているなら、特権メソッドでそれを行うことができます。このようなメソッドを使用して変数を使用することもできます。このメソッドはthis.methodName()を使用して表示されますが、オブジェクトのインスタンスにメソッドに適用するときにその方法を知りません – Ori

3

私はあなたが「特権メソッド」、プライベート変数にアクセスすることが可能である基本的にメソッドを作成しようとしていることを考える:

function a(given_id) { 
    var id= given_id; 

    this.myMethod = function() 
    { 
     alert(id); 
    } 
} 

あなたがない場合ので、あなたは、コンストラクタの外特権methosを宣言することはできませんだから、彼らはコンストラクタのクロージャにアクセスすることはありません。推奨

読み取り:

1

をJavaScriptで何のプライベートメンバー(自体)がないので、あなたは、あなたがやりたいことはできません。関数が新しいオブジェクトを返した後、コンストラクタ関数内のvarは直ちに破棄されます。したがって、後でそれにアクセスする方法はありません。どこかに貼り付けることができる唯一の方法は、コンストラクタ(this.foo = function(){};)内のメンバ関数をすぐに宣言することによってクロージャでそれをキャッチすることです。このメンバー関数をコンストラクタで宣言しなければならない理由は、クロージャを作成するためにネストされたスコープが必要なためです。その関数をプロトタイプオブジェクトのメンバーとして宣言するか、または既に作成されたオブジェクトに割り当てることで、ネストされたスコープを失います。したがって、クロージャーはなく、いわゆるプライベートメンバーへのアクセスはありません。

関連する問題