JavaScriptのプライベート変数を教えてください.

12206 ワード

関数で定義されている変数は、これらの変数は関数の外部ではアクセスできません.総じて、プライベート変数は、関数のパラメータ、局所変数、および関数の内部で定義される他の関数を含む.
function add(num1, num2){
    var sum = num1 + num2;
    return sum;
}
上記の例のnum 1、num 2、sumは関数のプライベート変数です.
この関数の内部にクローズド・パケットを作成すると、クローズド・パケットは自分のロール・ドメインチェーンを介してこれらの変数にもアクセスでき、この点を利用してプライベート変数にアクセスするための公有方法を作成することができる.
プライベート変数とプライベート関数にアクセスする権限がある公開方法を特権方法といいます.
1コンストラクタモード
特権的な方法を作る方法は二つあります.一つは構造関数で定義されます.
function MyObject(){

    //    
    var privateVariable = 10;

    //    
    function privateFunction(){
        return false;
    }

    //    
    this.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    };
}
ここで定義されている特権法はクローズドなので、構造関数で定義されているプライベート変数とプライベート関数にアクセスすることができます.MyObjectのインスタンスを作成すると、定義されたプライベート変数と関数は特権的な方法でのみアクセスできます.
この技術を利用して、外部から直接修正できないデータを隠すことができます.
function Person(name){
    this.getName= function () {
        return name;
    };
    this.setName= function (value) {
        name=value;
    }
}

var person=new Person("deniro");
console.log(person.getName());//deniro
person.setName("lily");
console.log(person.getName());//lily
上のコードは二つの特権的な方法を定義しています.それらはすべて関数の外部で呼び出すことができます.それらは閉じられているので、作用領域を通じてnameにアクセスすることができます.nameは、Personの各例では異なります.コンストラクタを呼び出すたびに、この2つの方法を再作成します.
コンストラクタにおいて特権的な方法を作成する欠点は、コンストラクターモードを使用して実現しなければならないことであり、このようにすると、各インスタンスにおいて同じ新しい方法のセットが作成されます.
2静的プライベート変数モード
プライベートスコープでプライベート変数と関数を定義することによって、特権方法を作成することもできます.
(function(){
    //    
    var privateVariable = 10;

    //    
    function privateFunction(){
        return false;
    }

    //    
    MyObject = function(){

    };

    //  /    
    MyObject.prototype.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    };
})();
公有法は原型に定義され、使用されるプロトタイプパターンです.また、構造関数を定義するために関数式を使用しています.また、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("deniro");
console.log(person1.getName());//deniro
person1.setName("lily");
console.log(person1.getName());//lily

var person2 = new Person("Jack");
console.log(person2.getName());//Jack
console.log(person1.getName());//Jack
したがって、各インスタンスには独自のプライベート変数がありません.
ドメインチェーンが長いと、ある程度の検索速度に影響を与える可能性があります.これはまさにクローズドとプライベート変数の使用には明らかに不足している.
3モジュールモード
モジュールモードは、一例でプライベート変数と特権を作成する方法です.一例としては一例の対象だけを指し、慣例としてJavaScriptは対象の字面量に基づいて一例のオブジェクトを作成する.
var singleton = {
    name : value,
    method: function(){
        //    
    }
}
モジュールモードは一例でプライベート変数と特権方法を追加しました.
var singleton = function(){
    //    
    var privateVariable = 10;

    //    
    function privateFunction(){
        return false;
    }


    //  /       
    return {
        publicProperty: true,
        publicMethod: function(){
            privateVariable++;
            return privateFunction();
        }
    };
}();
モジュールモードは、リターンオブジェクトの匿名関数を使用します.この匿名関数の内部では、まずプライベート変数と関数が定義され、次いでオブジェクトの字面量が関数の値として返されます.返したオブジェクトの字面量は、公開可能な属性と方法のみを含んでいます.このオブジェクトは匿名関数の内部で定義されているので、プライベート変数と関数にアクセスする権利があります.このようなモードは、1つの例をいくつかの初期化する必要があり、そのプライベート変数を維持する必要がある場合に有用である.
var BaseComponent = {};

var application = function () {
    //       
    var components = new Array();

    //   
    components.push(new BaseComponent());

    //  
    return {
        getComponentCount: function () {//         
            return components.length;
        },
        registerComponent: function (component) {//     
            if (typeof component == "object") {
                components.push(component);
            }
        }
    };
}();
webプログラムでは、アプリケーションレベルの情報を管理するために、一例を使用する必要があります.この例は、コンポーネントを管理するためのアプリオブジェクトを作成する.最初にプライベートなcomponents配列を宣言し、BaseComponentのインスタンスを追加しました.ここでは主にプレゼンテーションの初期化のために、リターンされたオブジェクトは行列にアクセスする権限を持つ特権的な方法を含んでいます.
オブジェクトを作成するには、初期化が必要であり、これらのプライベートデータにアクセスできる方法も開示されていれば、モジュールモードが使用されてもよい.
4強化モジュールモード
このようなモードは、これらの単一の例に適合していなければならないが、いくつかの属性または方法を追加する必要がある.
var singleton = function(){
    //    
    var privateVariable = 10;

    //    
    function privateFunction(){
        return false;
    }

    //    
    var object = new CustomType();

    //    /       
    object.publicProperty = true;
    object.publicMethod = function(){
            privateVariable++;
            return privateFunction();
    };

    //      
    return object;
}();
前の例を強化モジュールモードに変更します.
var BaseComponent = {};

var application = function () {
    //       
    var components = new Array();

    //   
    components.push(new BaseComponent());

    //   application        
    var app = new BaseComponent();

    //    
    app.getComponentCount = function () {
        return components.length;
    };
    app.registerComponent = function (component) {
        if (typeof component == "object") {
            components.push(component);
        }
    };

    //      
    return app;
}();