JavaScriptのpublic、prvateとprvilegedモード

6585 ワード

パブリック/プライベート変数と方法
簡単な例を通して、JavaScriptを使ってクラス内でプライベート変数と方法を作成する方法を示します.
Summary
  • プライベート変数は、オブジェクト内部で「var」キーを使用して宣言され、プライベート関数と特権方法によってのみアクセスできます.
  • プライベート関数は、オブジェクトのコンストラクター内で声明(またはvar functionName=function(){…}によって定義されています)を表しています.これは、特権関数によって呼び出すことができます.
  • 特権的な方法は、this.methodName=function(){…}によって宣言され、対象外のコードによって呼び出される可能性がある.特権関数を呼び出すには、this.特権関数を使用してもいいです.プライベート関数()を使用して、プライベート関数を呼び出します.
  • 共通属性は、this.variable Nameによって定義され、対象外では読み書きが可能である.プライベート関数によって呼び出すことはできません.
  • 共通方法は、Class Name.prototype.methodName=function(){…}によって定義され、オブジェクトの外部から呼び出すことができる.
  • プロトタイプ属性はClass Name.prototype.propertyName=someValueで定義されています.
  • 静的属性は、Class Name.propertyName=someValueによって定義される.
  • また、このような表記に注意してください.var関数名=function関数名(){…}という関数が呼び出されたときは、特権関数とプライベート関数の特性があります.
    例:
    Jsコード
  • <html>
    <head>
    <title></title>
    <script type="text/javascript">
    function Container( param ) {
    function dec(){
    if ( secret > 0 ) {
    secret -= 1;
    setSecret( 7)
    alert( secret );
    return true;
    }
    else {
    // alert( "over"+this.member);
    return false;
    }
    }
    // this.dec = dec;
    //this.dec = function dec (){...} different from above code.
    function setSecret( num ){
    secret = num;
    }
    this.member = param;
    var secret = 3;
    var self = this;
    this.service = function () {
    if (dec()) {
    alert();
    }
    else {
    return null;
    }
    }
    }
    // ---------------------------------------
    function start(){
    alert( "Start" )
    var test = new Container( 'liuqi' );
    // test.setSecret( 2 );
    test.service();
    test.service();
    test.service();
    test.service();
    var test2 = new Container( 'liuqi' );
    //test2.service();
    // Container.dec();
    }
    </script>
    </head>
    <body>
    <div onclick="start()" style="color:blue">click me</div>
    </body>
    </html>
    
  • JavaScriptは世界で一番誤解されているプログラミング言語です.JavaScriptオブジェクトはプライベート変数の方法を持つことができないので、情報隠蔽の特性に欠けていると考えられています.しかし、これは誤解です.JavaScriptオブジェクトはプライベートメンバーを持つことができます.対象となるJavaScriptは根本的に対象に関するものです.配列は対象で、方法は対象で、Objectも対象です.相手は何ですか?オブジェクトはキーのセットです.キーは文字列であり、値は文字列、数字、ブール、オブジェクト(配列と方法を含む)であります.オブジェクトは通常Hashtableとして実装されており、このように値を素早く取得することができる.値が関数なら、それを方法と呼びます.オブジェクトのメソッドを呼び出した場合、オブジェクトに「this」変数が付与されます.この方法は「this」変数によってインスタンス変数にアクセスできます.オブジェクトは、初期化オブジェクトの方法、コンストラクタによって生成されます.コンストラクタは、静的変数と方法を含む他のプログラミング言語でクラスが提供する特性を提供します.Publicオブジェクトのメンバーはすべてpublicメンバーです.どのオブジェクトでもアクセス、変更、削除、または新しいメンバーを追加できます.主に2つの方法があります.新しいオブジェクトにメンバーを配置します.構造関数では、この技術はpublicインスタンス変数を初期化するために使われます.コンストラクタの「this」変数を使用して、オブジェクトにメンバーを追加します.
    
    
    
    functin Container(param) {
    this.member = param;
    }
    functin Container(param) {
    
    this.member = param;
    
    }
    このように、私たちが新たな対象となるvar myContiner=new Continer('abc')を作ったら、myContiner.memberは'abc'です.prototypeではこの技術は普通public方法を追加するために使われます.メンバーを探してオブジェクト自体にいない場合は、オブジェクトのコンストラクタのプロトタイプのメンバーから探します.prototypeメカニズムは継承を行うために使用されます.構造関数で作成したすべてのオブジェクトに方法を追加するには、構造関数のプロトタイプに追加する必要があります.
    
    Container.prototype.stamp = function (string) {
    return this.member + string;
    }
    Container.prototype.stamp = function (string) {
    
    return this.member + string;
    
    }
    このように、この方法はmyContiner.stamp('def')を呼び出すことができます.結果は'abcdef'です.Private prvateのメンバーは構造関数によって生成される.普通のvar変数とコンストラクションのパラメータをprvateメンバーと呼びます.
    Javaコード
    
    function Container(param) {
    this.member = param;
    var secret = 3;
    var that = this;
    }
    function Container(param) {
    
    this.member = param;
    
    var secret = 3;
    
    var that = this;
    
    }
    このコンストラクタは3つのprvateインスタンス変数を作成しました.param、secret、that.それらはオブジェクトに追加されますが、外部からのアクセスはできません.それらはprvate方法でしかアクセスできません.prvate方法は構造関数の内部方法である.
    
    
    
    function Container(param) {
    function dec() {
    if (secret > 0) {
    secret -= 1;
    return true;
    } else {
    return false;
    }
    }
    this.member = param;
    var secret = 3;
    var that = this;
    }
    function Container(param) {
    
    function dec() {
    
    if (secret > 0) {
    
    secret -= 1;
    
    return true;
    
    } else {
    
    return false;
    
    }
    
    }
    
    this.member = param;
    
    var secret = 3;
    
    var that = this;
    
    }
    
    privte方法decはsecretインスタンス変数を検査します.それが0より大きいなら、secretを減らしてtrueに戻ります.そうでなければfalseに戻ります.このオブジェクトを3回まで制限できるようにします.慣例によって、prvateのthat変数を定義します.これはprvate方法を使用して本オブジェクトを使用することができます.このようにするのはECMAScript言語規範に誤りがあるためで、このエラーは正しい設定ができなくなりました.prvate方法はpublic方法に呼び出されません.prvate方法を有用にするために、privleged方法を導入する必要があります.Privileged privleged方法はprvate変数と方法にアクセスでき、それ自体はpublic方法と外部にアクセスできます.prevlegedメソッドを削除または代替することができますが、それを変更することはできません.privleged方法はコンストラクタにthisで割り当てられます.
    Javaコード
    
    function Container(param) {
    function dec() {
    if (secret > 0) {
    secret -= 1;
    return true;
    } else {
    return false;
    }
    }
    this.member = param;
    var secret = 3;
    var that = this;
    this.service = function() {
    if (dec()) {
    return that.member;
    } else {
    return null;
    }
    };
    }
    function Container(param) {
    
    function dec() {
    
    if (secret > 0) {
    
    secret -= 1;
    
    return true;
    
    } else {
    
    return false;
    
    }
    
    }
    
    this.member = param;
    
    var secret = 3;
    
    var that = this;
    
    this.service = function() {
    
    if (dec()) {
    
    return that.member;
    
    } else {
    
    return null;
    
    }
    
    };
    
    }
    
    serviceはprivleged方法です.最初の3回の呼び出しはmyContiner.service()が'abc'に戻ります.その後、nullに戻ります.serviceはprvateのdec方法を呼び出し、dec方法はprvateのsecret変数にアクセスします.serviceは他のオブジェクトと方法に対して見られますが、直接prvate変数にアクセスすることはできません.クローズドはJavaScriptのためにクローズドされています.public、prvateとprvilegedのメンバーのモデルが可能です.これは一つの内部法が常にその外部方法のvar変数とパラメータにアクセスできることを意味し、さらには外部法が戻ってきた後でさえもある.これはJavaScript言語の非常に強力な特性です.現在はこのような特性を発掘するためのJavaScriptプログラミング書が展示されていません.ほとんどは言及されていません.privteとprevlegedのメンバーはオブジェクトが構成されている時のみ発生します.publicメンバーはいつでも追加できます.パターンpublic
    Javaコード
    
    function Constructor(...) {
    this.membername = value;
    }
    Constructor.prototype.membername = value;
    function Constructor(...) {
    
    this.membername = value;
    
    }
    
    Constructor.prototype.membername = value;
    Private
    Javaコード
    
    function Constructor(...) {
    var that = this;
    var membername = value;
    function membername(...) {...}
    }
    //   : function  
    // function membername(...) {...}
    //         
    // var membername = function membername(...) {...};
    function Constructor(...) {
    
    var that = this;
    
    var membername = value;
    
    function membername(...) {...}
    
    }
    
    //   : function  
    
    // function membername(...) {...}
    
    //         
    
    // var membername = function membername(...) {...};
    Privileged
    Javaコード
    
    function Constructor(...) {
    this.membername = function (...) {...};
    }
    function Constructor(...) {
    
    this.membername = function (...) {...};
    
    }
    privleged方法を簡単に構成関数のpublic方法として見ることができると思います.privleged方法は外部とpublic方法によってアクセスできるので、それ自体はprvate変数にアクセスすることができます.