あなたのコードはほぼ正しいです。thistagId にアクセスするときに失うだけです。上で宣言したthis.tagIdものではなく、その特定の TextField にプロパティを設定しています。var tagId
のようにxを使用せずに変数を設定すると、スコープ チェーンを上っていく最も近いものを見つけます。何も見つからない場合は、グローバル オブジェクト ( ) のプロパティになります。あなたの場合、これらの関数は1レベル上に到達できるため、これらの関数のいずれかから変更できます。そのため、「プライベート」変数として使用され、同じ方法で到達できます。varx = 2xwindowtagIdprivateMethod
そして、関数全体からの戻り値に設定されているので、内部で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
}());