オブジェクト向けプログラミング(-)

6680 ワード

tips:これからgithubでブログを书きます.文章を更新したり修正したりしません.私の新しいブログを见てください.できるだけ分かりやすい方法でブログを书いて、みんなで交流を学びます.

オブジェクトの理解


定義:オブジェクトは無秩序属性の集合であり、その属性には基本値、オブジェクト、または関数を含めることができます。


属性タイプ

  • データ属性

  • アクセサ属性
  • オブジェクトの作成


    コンストラクション関数(コンストラクション関数)またはオブジェクトの字面量(Object Texture Amount)メソッドで関数を作成できます。

  • 欠点:1つのインタフェースで多くのオブジェクトを作成すると、大量の重複コード
  • が生成されます.

    工場モード

      function creatPerson(name,age,job){  
            var o=new Object();  
            o.name=name;  
            o.age=age;  
            o.job=job;  
            return o  
        }                                                                        
      var person1 = creatPerson(“hxvin”,21,”F-E”);  
    
    
  • は、特定のインタフェースでオブジェクトを作成するための詳細
  • を関数でカプセル化する.
  • 欠点:オブジェクト識別の問題が解決されていない
  • コンストラクタモード

     function Person(name,age,job){  
            this.name=name;  
            this.age=age;  
            this.job=job;  
            this.sayName=function sayName(){alert(this.name);};  
        };  
        var person1=new Person(“hxvin”,21,"Front-end-Engineer");  
    
  • と工場モデルの違い:
  • 明示的な作成オブジェクトがない
  • 属性とメソッドをthis
  • に直接付与
  • return文がない
  • この方法でコンストラクション関数を呼び出すと、4つのステップがあります.
  • 実行コンストラクション関数のコード(この新しいオブジェクトに属性を追加)
  • 新規オブジェクトを作成する
  • コンストラクション関数の役割ドメインを新しいオブジェクト
  • に割り当てる
  • は、新しいオブジェクト
  • を返す.
  • 欠点:各メソッドは各インスタンスに1回作成されます.
  • 前例のsayNameメソッドは
  • に相当します.
    this.sayName=new Funciton("alert(name,age,job)")
  • 解決方法
  •           function Person(name,age,job){  
                    this.name=name;  
                    this.age=age;  
                    this.job=job;  
                    this.sayName=sayName  
                };  
                function sayName(){alert(this.name);};  
                // sayName ,   
    
  • プロトタイプモード
  • プロトタイプモード

  • コンセプト
  • 各関数には、ポインタであるオブジェクトを指すprototype(プロトタイプ)属性があり、このオブジェクトの用途は、特定のタイプのすべてのインスタンスで共有可能な属性と方法
  • を含む
  • プロトタイプオブジェクトを使用する利点は、すべてのオブジェクトインスタンスに含まれる属性およびメソッド
  • を共有させることである.
  • プロトタイプの作成:
  •        function Person(){};  
            Person.prototype.name=“hxvin”;  
            Person.prototype.sayname=function(){ alert(this.name);  };                         
            var person1=new Person();                                   
            person1.dayName(); //“hxvin”  
            
    
  • プロトタイプの理解
  • 新しい関数を作成すると、関数のプロトタイプオブジェクトを指す特定のルールのセットに基づいてprotoypeプロパティが作成されます.
  • デフォルトでは、prototypeプロパティが存在する関数を指すポインタ
  • を含むconstructor(コンストラクション関数)プロパティがすべてのプロトタイプオブジェクトに自動的に取得されます.
  • 検索プロセス
  • オブジェクトインスタンスがインスタンスプロトタイプのプロパティと同じ名前である場合、インスタンスにプロパティを作成します.このプロパティは、プロトタイプのプロパティ
  • をマスクします.
  • コードがオブジェクトのプロパティを読み込むたびに、インスタンスから検索した後、プロトタイプオブジェクトで
  • を検索する.
  • hasOwnProperty()
  • は、属性がオブジェクトインスタンスに存在するかプロトタイプに存在するかを調べるために使用され、この方法は、与えられた属性がオブジェクトインスタンスに存在する場合にのみtrue
  • を返す.
  • alert(person1 hasOwnProperty("name"));//trueまたはfalse
  • を返します.

  • [[prototype]]
  • コンストラクタを呼び出して新しいインスタンスを作成すると、インスタンスの内部には、コンストラクタのプロトタイプオブジェクト
  • を指すポインタ(内部プロパティ)が含まれます.
  • 利用[[prototype]]
  • ECMAScript 5はObjectという新しい方法を追加した.getPropertyOf()は、サポートされているすべての実装で、このメソッドは[[prototype]]の値を返します.
  • がサポートするブラウザ:IE 9+,FireFox 3.5+,Safari 3.5+,Opera12+,Chrome

  • ただし、isPrototypeOf()メソッドによってオブジェクト間にこの関係があるかどうかを決定できます.
  • alert(Person.protoype isPrototypeOf(person1));//true

  • 標準的な方法なしで[[prototype]]
  • にアクセス


  • より単純なプロトタイプ構文
  •       // constructor  
            function Perspn(){};  
            Person.prototype={  
                constructor=Person,  
                name="Nick"  
            };  
      
          function Person(){};  
            Person.prototype={  
                name="Nick",  
                sayName=function(){alert(this.name)}  
            }  
    
  • 注意!!!constructorプロパティはPersonを指しません.ここで使用する構文は本質的にデフォルトのprototypeオブジェクトを完全に書き換えているので、現在のconstructorはObjectコンストラクション関数
  • を指しています.
  • プロトタイプのダイナミック
  • 注意:プロトタイプを別のオブジェクトに変更すると、コンストラクション関数と最初のプロトタイプとのつながりが切断される([[prototype]]ポインタが変更されたため)
  • プロトタイプオブジェクトに対する変更は、
  • をインスタンスから直ちに反映することができる.
  • プロトタイプオブジェクトの問題(欠点)
  • 1、コンストラクタに初期化パラメータを渡す部分を省略すると、すべてのインスタンスがデフォルトで同じ属性値
  • を取得する.
  • 2、参照タイプの値をインスタンスで操作すると、プロトタイプの値が変更される可能性が高い.(共有の問題)
  • friends配列がPersonに存在するためである.prototypeはperson 1ではないので、さっき述べた修正もperson 2を通過する.friends(person 2.friendsと同じ配列を指す
  • を反映する.


    コンストラクション関数モードとプロトタイプモードの組み合わせ

     function Person(name,age,job){  
           this.name=name,  
           this.age=age,  
           this.job=job  
       };  
       Person.prototype={  
           constructor=Person,  
           sayName=function(){alert(this.name)}  
       }  
    
  • Person1.friendsはPerson 2に影響しない.friendsは、それぞれ異なる配列
  • を参照しているため
  • の利点
  • 各インスタンスには独自のインスタンスプロパティのコピーがありますが、メソッドへの参照を共有することで、メモリ
  • を最大限に節約できます.
  • カスタムタイプを作成する最も一般的な方法
  • は、構造関数へのパラメータの伝達
  • をサポートする.

    ダイナミックプロトタイプモード

      function Person(name,age,job){          //   
            this.name=name;  
            this.age=age;  
            this.job=job;  
            //   
            if(typeof sayName != "function"){  
                Person.prototype.sayName = function(){alert(this.name)}  
            }  
        } 
         
    

    //メソッドでは、sayName()メソッドが存在しない場合にのみ、プロトタイプに追加されます.ここでプロトタイプに対する修正は,直ちにすべてのインスタンスに反映される.
  • は、すべての情報を構造関数にカプセル化し、if文によってプロトタイプ
  • を初期化する.

    寄生構造関数モード

      function Person(name,age,job){  
            var o = new Object();  
            o.name = name;  
            o.age = age;  
            o.job = job;  
            o.sayName = function(){alert(o.name)};  
            return o  
        };  
        var person1 = new Person();  
        
    
  • 適用シーン:既存のコンストラクション関数
  • を変更することなく、追加の方法のある特殊なオブジェクトを作成します.
  • の特徴
  • が返すオブジェクトとコンストラクション関数は関係ありません
  • instanceofオペレータに依存してオブジェクトタイプ
  • を決定することはできない.

    あんていこうぞうかんすうモード

  • 安定オブジェクトとは、共通の属性がなく、その方法もthisを参照しないオブジェクトを指す.
  •   function Person(name,age,job){  
            var o = new Object();  
            o.sayName = function(){alert(name)}  
        }  
      
        var friend = Person (“hxvin”,”21”,”f-e”);  
            friend.sayName(}; //“hxvin” 
    
    

    これにより、クラゲpersonにはsayName()メソッドを呼び出す以外に、データ・メンバーにアクセスできる適切なオブジェクトが保存されます.
  • このモードで作成されたオブジェクトには、sayName()メソッドを使用する以外にnameの値にアクセスする方法はありません.
  • アプリケーションシーン:thisやnewの使用が禁止されている安全な環境や、Mashupプログラムなどの他のアプリケーションでデータが変更されないようにするために
  • を使用する安全な環境があります.
  • の特徴:寄生構造関数と同様のモードに従いますが、2つの違いがあります.1つは、オブジェクトを新しく作成するインスタンスメソッドがthisを参照しないことです.二つ目はnewオペレータ呼び出し構造関数
  • を使用しないことである.