JavaScriptでは、(他のOOP言語のように)プライベート変数を実現しようとしています。
クロージャを介してのみ可能ですか、それともプライベート変数を実装できる他の方法はありますか?
どんな例でも本当に役に立ちます。
JavaScriptでは、(他のOOP言語のように)プライベート変数を実現しようとしています。
クロージャを介してのみ可能ですか、それともプライベート変数を実装できる他の方法はありますか?
どんな例でも本当に役に立ちます。
プライベートメンバーはコンストラクターによって作成されます。コンストラクターの通常の変数とパラメーターがプライベートメンバーになります。
function Container(param) {
this.member = param;
var secret = 3;
var that = this;
}
このコンストラクターは、param、secret、およびthatの3つのプライベートインスタンス変数を作成します。これらはオブジェクトにアタッチされていますが、外部からはアクセスできず、オブジェクト自体のパブリックメソッドからもアクセスできません。それらはプライベートメソッドにアクセスできます。プライベートメソッドは、コンストラクターの内部関数です。
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
}
プライベートメソッドdecは、シークレットインスタンス変数を調べます。ゼロより大きい場合は、シークレットをデクリメントしてtrueを返します。それ以外の場合はfalseを返します。これを使用して、このオブジェクトを3回の使用に制限することができます。
慣例により、プライベートthis
変数(that
)を作成します。これは、オブジェクトをプライベートメソッドで使用できるようにするために使用されます。これは、this
内部関数に対して誤って設定される原因となるECMAScript言語仕様のエラーの回避策です。
プライベートメソッドをパブリックメソッドから呼び出すことはできません。プライベートメソッドを便利にするには、特権メソッドを導入する必要があります。
参照については、このhttp://javascript.crockford.com/private.htmlを見ることができます
クラス(関数)の場合、「var」と「this」を使用しているだけです。
function myObject() {
var myPrivateVariable = 10;
this.myPublicVariable = 20;
}
変数は、それが定義されている関数内でのみ認識されます。したがって、Sahil Groverlet
が受け入れた回答は、JavaScript仕様に最近追加されたステートメントを除いて、基本をほぼカバーしています。
Node.jsおよび最新のブラウザーでは、これも実行できるようになりました。
function loop(arr) {
// i IS NOT known here
// j IS NOT known here
for( var i = 0; i < arr.length; i++ ) {
// i IS known here
};
// i IS known here
// j IS NOT known here
for( let j = 0; j < arr.length; j++ ) {
// j IS known here
};
// i IS known here
// j IS NOT known here
}
let varName = ...
は、それが含まれているブロックに対してのみ認識されます。したがって、この場合、変数j
は最初のforループでのみ認識され、前後では認識されません。代わりに使用する場合は、var varName = ...
定義された瞬間から関数全体で認識されます。
それでは、基本を超えてみましょう。
JavaScriptの強みは、オブジェクトの定義方法に関して多くの自由を与えることです。ただし、これも弱点です。今日のところ、ほとんどの人がJavaScriptでOOPを実行する独自の方法を持っています。
私が自分で書いたJavaScriptコードのほとんどは、通常、次のパターンを使用しています。
var keyValueStore = (function() {
// Private "static" properties go here
var count = 0;
var kvs = function() {
// Here, you can define private instance properties as "var property = ..."
// You can also define public instance properties as "this.property = ..."
count++;
};
kvs.prototype = {
// Public instance properties can also go here
‘data’ : {},
‘get’ : function(key) {
return this.data[key];
},
‘set’ : function(key, value) {
this.data[key] = value;
},
‘delete’ : function(key) {
delete this.data[key];
},
‘getLength’ : function() {
var l = 0;
for (p in this.data) l++;
return l;
}
};
return {
// Public "static" properties go here
‘create’ : function() { return new kvs(); },
‘count’ : function() { return count; }
};
})();
コードに入れたコメントに示されているように、このパターンでは、「静的」プロパティ(「クラス」レベルのプロパティ)とインスタンスプロパティの両方を定義でき、どちらもプライベートまたはパブリックのいずれかになります。そして、私が見た他のいくつかのパターンとは異なり、コードを理解するのを非常に難しくすることなくそうします。
kvs = keyValueStore.create();
kvs.set(‘Tom’, “Baker”);
kvs.set(‘Daisy’, “Hostess”);
var profession_of_daisy = kvs.get(‘Daisy’);
kvs.delete(‘Daisy’);
console.log(keyValueStore.count());