JavaScriptアドバンストプログラム設計の関数表現式のプライベート変数の静的プライベート変数


厳密には、JavaScriptにはプライベートメンバーの概念がない.オブジェクトの属性はすべて公有です.でも、私有があります.
変数の概念関数で定義された変数は、関数の外部からこれらの変数にアクセスできないので、プライベート変数と見なされます.
プライベート変数は、関数のパラメータ、局所変数、および関数内部で定義される他の関数を含みます.次の例を見てみます.
function add(num1, num2){
var sum = num1 + num2;
return sum;
}
この関数の内部には、3つのプライベート変数があります.num 1、num 2、sum.関数内部ではこれらの変数にアクセスできますが、
関数の外部はそれらにアクセスできません.この関数の内部にクローズドパッケージを作成すると、クローズドは自分のロールドメインチェーンを通じて訪問することができます.
これらの変数を聞きます.この点を利用して、プライベート変数にアクセスするための共有方法を作成することができます.
私たちはプライベート変数とプライベート関数にアクセスする権利がある公開方法を特権方法と呼びます.相手に特権を作る方法は二つあります.第一は、構造関数において特権的な方法を定義することであり、基本的なパターンは以下の通りである.
function MyObject(){
//         
var privateVariable = 10;
function privateFunction(){
return false;
}
//    
this.publicMethod = function (){
privateVariable++;
return privateFunction();
};
}
このモードは構造関数内部ですべての私有変数と関数を定義した.そして、これらのプライベートメンバーにアクセスできるようになりました.
の特権的な方法です.構造関数で特権的な方法を定義できるのは、特権的な方法がクローズドとして構造関数で定義されているものにアクセスできるからです.
すべての変数と関数.この例に対しては、変数prvateVarableと関数prvateFunctionは、特
権方法publicMethod()が訪問します.MyObjectを作成した後、この道はpublicMethodを使用します.
以外の方法はありません.直接prvateVarableとprvateFunctionにアクセスできます.
プライベートおよび特権のメンバーを利用して、直接に変更すべきでないデータを隠すことができます.例えば、
function Person(name){
this.getName = function(){
return name;
};
this.setName = function (value) {
name = value;
};
}
var person = new Person("Nicholas");
alert(person.getName()); //"Nicholas"
person.setName("Greg");
alert(person.getName()); //"Greg"
以上のコードの構造関数には二つの特権方法が定義されています.この二つの方法は全部構成できます.
作成関数は外部で使用され、プライベート変数nameにアクセスする権利があります.しかし、Personコンストラクタの外部では、nameにアクセスする方法はありません.
この2つの方法は構造関数の内部で定義されているので、それらは閉ループとして作用ドメインチェーンを通してnameにアクセスできる.プライベート変数name
Personの各例では、構造関数を呼び出すたびに、この2つの方法を再作成するので、同じではない.ただし、構造上は
関数で特権を定義する方法にも欠点があります.つまり、あなたはコンストラクションモードを使ってこの目的を達成しなければなりません.第6章で議論したことがありますが、構造関数モードの欠点は各インスタンスに対して同じ新しい方法を作成することです.静的なプライベート変数を使って特権を実現する方法はこの問題を避けることができます.
7.4.1静的私有変数は、私有作用領域に私有変数または関数を定義することにより、以下のように特権的方法を作成することもできる.
(function(){
//         
var privateVariable = 10;
function privateFunction(){
return false;
}
//    
MyObject = function(){
};
//  /    
MyObject.prototype.publicMethod = function(){
privateVariable++;
return privateFunction();
};
})();
このモードはプライベートスコープを作成し,構造関数と対応する方法をカプセル化した.プライベートスコープでは、
最初にプライベート変数とプライベート関数を定義し,次に構造関数とその共有方法を定義した.公有法は原型で定義されています.
この点は典型的なプロトタイプパターンを示している.このモードは構造関数を定義する際に関数宣言を使用しないことに注意してください.
関数式を使いました.関数宣言は局所関数のみを作成できますが、それは私たちが望むものではありません.同じ原因で、私達もないです.
MyObjectを宣言する時にvarキーワードを使うことがあります.覚えてください.宣言されていない変数を初期化します.常にグローバル変数を作成します.
したがって、MyObjectは大域変数となり、プライベートスコープ以外でアクセスできるようになる.厳しいモードで
宣言されていない変数に値を割り当てるとエラーが発生します.
このモードは、構造関数において特権的な方法を定義する際の主な違いとして、私有変数と関数がインスタンスによって共有されることにある.によって
特権的な方法は原型で定義されていますので、すべての例は同じ関数を使います.この特権的な方法は、常にクローズドとして
スコープを含む参照が保存されています.下のコードを見てください.
(function(){
var name = "";
Person = function(value){
name = value;
};
Person.prototype.getName = function(){
return name;
};
Person.prototype.setName = function (value){
name = value;
};
})();
var person1 = new Person("Nicholas");
alert(person1.getName()); //"Nicholas"
person1.setName("Greg");
alert(person1.getName()); //"Greg"
var person2 = new Person("Michael");
alert(person1.getName()); //"Michael"
alert(person2.getName()); //"Michael"
この例のPerson構成関数は、getName()およびset Name()方法と同様に、プライベート変数nameにアクセスする権利がある.
このようなモードでは、変数nameは、すべてのインスタンスによって共有される静的な属性となる.つまり、一例で上げるということです.
setName()を使うと、すべての例に影響を与えます.setNameを呼び出したり、Personを新たに作ったりすると、name属性が付与されます.
新しい値その結果、すべてのインスタンスが同じ値を返します.
このようにして静的プライベート変数を作成すると、プロトタイプを使用することによってコード多重化が促進されますが、各インスタンスには独自の私有変化がありません.
量を量る?測るインスタンス変数を使うか、それとも静的プライベート変数を使うかは、最終的にはあなたの具体的な需要によって決まります.
作用するドメインチェーンの1つの階層を多く検索すると、検索速度に影響を与えます.これはまさに使うものです
クローズドとプライベート変数の著しい不足点.