あなたのコードはほぼ正しいです。this
tagId にアクセスするときに失うだけです。上で宣言したthis.tagId
ものではなく、その特定の TextField にプロパティを設定しています。var tagId
のようにx
を使用せずに変数を設定すると、スコープ チェーンを上っていく最も近いものを見つけます。何も見つからない場合は、グローバル オブジェクト ( ) のプロパティになります。あなたの場合、これらの関数は1レベル上に到達できるため、これらの関数のいずれかから変更できます。そのため、「プライベート」変数として使用され、同じ方法で到達できます。var
x = 2
x
window
tagId
privateMethod
そして、関数全体からの戻り値に設定されているので、内部でjeeni.TextField
参照する必要はありません。jeeni
jeeni.TextField = (function(){
var tagId;
var privateMethod = function(){
console.log("IN: privateMethod");
}
var publicMethod = function(){
console.log("IN: publicMethod: " + tagId);
}
function TextField(id){
// this === the new instance of TextField
console.log("Constructor", this);
// set the tagId variable which is in scope here
tagId = id;
}
TextField.prototype.foo = publicMethod
return TextField
}());
public/private メソッドの前にも追加したことに注意してくださいvar
。そうしないと、それらがグローバル スコープにリークされます。を使用することもできますがfunction publicMethod(){ ... }
、通常はデバッグに適しています。
混乱している場合x = function(){}...
は、 と同じではありませんfunction x(){}
。「名前付き関数式の解明」の第 2 章を参照してください。
このコードtagId
を使用すると、 TextField のすべてのインスタンス間で共有されるため、これはおそらくあなたが望むものではありません。インスタンスごとに1つ持つ通常の方法は、tagId
それを「パブリック」プロパティにすることです。これはまさにあなたが行ったことです(id
それ自体は外部から来るので、これには何の問題もありません):
...
// var tagId -> drop this
publicMethod = function(){
console.log("IN: publicMethod: " + this.tagId);
}
function TextField(id){
console.log("Constructor");
this.tagId = id;
}
tagId
次に、インスタンスごとにプライベートで固有のものにしましょう。毎回新しい関数を作成せずにこれを行う最も簡単な方法は、tags
すべてのデータを保持するプライベート オブジェクト ( と呼びましょう) を作成し、各インスタンスに独自の ID ( tf_id
) を与えることです。ID は表示されますが、tags
オブジェクトはプライベートであるため、パブリック メソッドのいずれかを使用してのみデータにアクセスできます。
jeeni.TextField = (function(){
var tags = {}
, uid = 0;
privateMethod = function(){
console.log("IN: privateMethod");
}
publicMethod = function(){
console.log("IN: publicMethod: " + tags[this.tf_id].tagId);
}
function TextField(id){
this.tf_id = uid++
tags[this.tf_id] = id
}
TextField.prototype.foo = publicMethod
return TextField
}());