JacaScriptプライベート変数(一)は何ですか?

1951 ワード

厳密には、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とprvateFunct()に直接アクセスできる方法はありません.
プライベートと特権を利用して、直接的に変更すべきでないデータを隠すことができます.
function Person(name) {


    this.getName = function() {
        return name;
    }

    this.setName = function(value) {
        name = value;
    }
}

var person = new Person("Bert")
alert(person.getName()) // "Bert"

person.setName("Greg");
alert(person.getName()) // "Greg"
上記のコードの構造関数には二つの特権方法が定義されています.この2つの方法はいずれも構造関数の外部で使用でき,プライベート変数nameにアクセスする権利がある.しかし、Personコンストラクタの外部では、nameにアクセスする方法はありません.
この二つの方法は構造関数の内部で定義されているので、彼らは閉ループとして作用ドメインチェーンを通してnameにアクセスできる.
プライベート変数nameは、Personの各インスタンスでは異なります.コンストラクタを呼び出すたびに、2つの方法を再構築します.
しかし、構造関数で特権を定義する方法にも欠点があります.それは構造関数モードを使用してこの目的を達成しなければなりません.
コンストラクタモードの接点は、各インスタンスに対して同じ新しい方法のセットを作成することであり、静的プライベート変数を使用して特権的方法を実現することで、この問題を回避することができる.