JavaScriptに深く入り込む(4)-new演算子はどのように働きますか?

2389 ワード

上編(//www.cnblogs.com/patrick-holynova/archive/2013/05/14/3077295.html)に続き、OOPで重要なnew演算についてお話しします。
JavaScriptは上級言語C++やJavaなどのように、クラスに対するサポートを提供していません。Jsでは、クラス、クラスの実例をどのように実現しますか?
  • 対象字面量
  • コンストラクタで作成
  • 対象文字数、例:
    Detail = {
    
        'game': 'World of Warcraft',
    
        'class':  'Priest',
    
        'spell':   'Holy Nova'
    
    }
    
    
     このような方法は何も言いにくいです。重点的にコンストラクタを通して実例を作ります。
    コンストラクタとは何ですか前の何回も言ったことがあります。また、その構造関数を呼んでもいいです。
    prototypeの属性は、この属性が指すオブジェクトで、インスタンスを初期化するために使用されます。proto_つまり、新しい実例たちはこの対象を引き継いでいます。
    もちろん、一つのコンストラクタには多くの内部方法が必要です。
    構造関数はnew表現によって新しいオブジェクトを作成する必要があります。newを使わないと、結果は具体的な構造関数の書き方に依存します。
    たとえば:
    d1  = Date();    // "Mon May 20 2013 10:10:38 GMT+0800 (China Standard Time)"
    
    // typeof d1 == 'string' ,         ,     '  '.
    
    
    
    d2 = new Date();    // typeof d2 == 'object' , d2     
    
    
     各構造関数によって作成されたオブジェクトは、構造関数のプロトタイプオブジェクトに陰的に参照されます。
    d2.__proto__ === Date.prototype;    // true
    
    Object.getPrototypeOf(d) === Date.prototype;    // true
    
    
     ------------
    new演算はどうやって働きますか?
    まず、このような構造関数があると仮定します。
    var WOWCharacter = function(cName) {
    
        var level = 0;
    
        
    
        this.name = cName;
    
    
    
        this.getLevel = function() { return this. level; }
    
        this.setLevel = function(lv) { this.level = lv; return this.getLevel(); }  
    
    }
    
    
     キャラクターを作成して、クラスのインスタンスを作成します。
    var subsidiaryCharacter = new WOWCharacter('   ');
    
    //   subsidiaryCharater      
    
    {
    
        name: '   ',
    
        getLevel: function(){...},
    
        setLevel: function(){...}
    
    }
    
    
     ちょっとお聞きしたいのですが、level属性はどこにありますか?実はこれは「私有変数」です。直接訪問することはできません。これは文章の最後に紹介するポイントで、本編の重点ではありません。
    newの実行過程
  • 新たなオブジェクトを作成します。obj=new Object()
  • WOW Charcterアーキテクチャ関数を呼び出す:着信パラメータ(あるなら)、本例では(「巫猫王」)であり、構築関数のthisを新たなオブジェクトobj
  • コンストラクタが一つのオブジェクトに戻ったら、最終的な新しい例はこのオブジェクト(この例では、コンストラクタは戻り値がなく、通常は戻り値がない。)コンストラクタが一つのオブジェクトに戻らない場合、第1ステップで作成したオブジェクトobjを最終的な戻り値とする。subsidiaryCharcter=obj.4591678・
    --over--
    new演算は雑談し終わって、上で私有変数の問題に言及して、levelは1つの私有の変数で、“特権の関数”get Levelを通すことしかできなくて、set Levelは訪問します。
    直接subsidiary Charcter.levelは値が取れないです。なぜですか?包みを閉じる
    今度はJsの中のクローズドについて話しましょう。