javascriptは対象に向けてカプセル化と継承します.

5450 ワード

対象に向けたjsのパッケージと継承を整理します.
1.パッケージjsには多くの実装方法があります.ここにはよく使われているいくつかの種類があります.
1.1オリジナルモード生成オブジェクトは直接に私たちのメンバーをオブジェクトに書き込み、関数で返します.短所:パターンが出てくる例としては分かりにくいです.
コード:
 
  
       function Stu(name, score) {
            return {
                name: name,
                score: score
            }
        }
        var stu1 = Stu(" ", 80);
        var stu2 = Stu(" ", 90);
        console.log(stu1.name); //
1.2作成モードオブジェクトを生成する
jsは構造関数を使ってオブジェクトを生成するモードを提供してくれました.‥いわゆる「構造関数」は、実は普通の関数ですが、内部ではthis変数を使用しています.newキーワードを使ってコンストラクタにインスタンスを生成すると、this変数はインスタンスオブジェクトに結合されます.
直接コード:
 
  
      function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        var stu1 = new Stu(" ", 80);
        var stu2 = new Stu(" ", 90);
        console.log(stu1.name + "/" + stu2.score); //   90
        console.log((stu1.constructor == Stu) + "/" + (stu2.constructor == Stu)); // true  true
        console.log((stu1 instanceof Stu) + "/" + (stu2 instanceof Stu)); // true  true
jsのコンストラクタ生成オブジェクトとC菗用classでオブジェクトを生成するのは同じで、テンプレートでオブジェクトを定義するメンバーがnewキーワードで実装されていることが分かります.
C〓〓コードで同じStuオブジェクトを生成します.
 
  
Class Stu
{
  public string name;
  public double score;                   
}
ここまでの基本的な相手ができました.今はすべてのオブジェクトを共用する方法が必要です.そしてこの方法を一回だけ作成してください.(対象newに従って重複しないで作成します.)どうすればいいですか?みんなはC〓の中で静的なメンバーを使うことができることを知っています.jsの中ではどうしますか?
1.3 Prottotypeモード
jsでは、各構造関数にプロポーチ属性があり、このオブジェクトのすべての属性と方法は、構造関数の例によって継承されます.私たちが直接プロトタイプにメンバーを追加するのは、C〓中で静的なメンバーを宣言するのに相当します.
コード:
 
  
      function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        Stu.prototype.type=' ';
        Stu.prototype.log = function (s) {
            console.log(s);
        }
        var stu1 = new Stu(" ", 80);
        var stu2 = new Stu(" ", 90);
        console.log(stu1.type + "/" + stu2.type); //
        stu1.log('hello');  // hello
        console.log(stu1.log == stu2.log);  // true
パッケージはここまでです.ここではjsの継承はどうやって実現されるのかを見てみます.
2.継承
2.1コンストラクタバインディング
サブ関数で直接コールまたはapplyメソッドを呼び出して、親オブジェクトの構造関数をサブオブジェクトに結合します. 
 
  
   function Stu(name, score) {
            Grade.apply(this, arguments);
            //Grade.call(this, arguments);
            this.name = name,
            this.score = score
        }
        function Grade() {
            this.code = " ";
            this.ask = function () {
                console.log(" ");
            }
        }
        var stu1 = new Stu(" ", 80);
        var stu2 = new Stu(" ", 90);
        console.log(stu1.code); //
        stu1.ask(); //
ここのアプリは二つのことをして、最初のパラメータthisをGradeコンストラクタにあげて、それからGradeのコードを実行します.Gradeでthisで定義したメンバーをStuでもう一度実行するのと同じです.
2.2 prototypeでコードを引き継ぐ
コード:
 
  
    function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        function Grade() {
            this.code = " ";
        }
        Stu.prototype = new Grade();
        Stu.prototype.constructor = Stu; // ,
        var stu1 = new Stu(" ", 80);
        var stu2 = new Stu(" ", 90);
        console.log(Stu.prototype.constructor); //
        console.log(stu1.code); //
前に言ったプロトタイプはC〓の中の静的なメンバーに相当します.だから私達は父類の全メンバーを自分の静的なメンバーに変えて継承を実現します.
prototypeで継承するという欠点があります.全員が静的である場合、対象メンバーはどう継承されますか?
2.3コピー引継ぎ
親オブジェクトのすべての属性と方法を、子オブジェクトにコピーし、継承を実現します.
コード:
 
  
    function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        function Grade() {}
        Grade.prototype.code = " ";
    }
        //
        function extend(C, P) {
            var p = P.prototype;
            var c = C.prototype;
            for (var i in p) {
                c[i] = p[i];
            }
        }
        extend(Stu, Grade);
        var stu1 = new Stu(" ", 80);
        var stu2 = new Stu(" ", 90);
        stu1.code=' ';
        console.log(stu1.code); //
        console.log(stu2.code); //
        console.log(Stu.prototype.constructor);
        console.log(Grade.prototype.constructor)
    jsの対象に向けた整理はここに書いてあります.これも変わらないものではなく、使う時は自分の需要によって変えます.  いい言葉があって、似合うのが一番いいです.
ここではパッケージと継承についてのみ分析を行いました.その後、他の方面の文章を作って、友達にjavascriptが対象に向けてプログラミングすることをもっと深く理解させます.もちろん個人的な理解です.もし漏れがあったら、連絡してください.