jsカスタムオブジェクトを作成するいくつかの方法


1.対象の字面量方式(JSONにより対象を作成).
オブジェクトの字面量方式は、カスタムオブジェクトを作成するための優先モードで、簡単で便利です.
var person = {
     
    name: '    ',
    job: 'html',
    getName: function () {
     
         alert(this.name);
    }
}
短所:同じインターフェースを使って多くのオブジェクトを作成すると、多くの重複コードが発生します.たとえば、私はもう一つのperson 1オブジェクトを作成したいです.上のコードをもう一度書き直して、属性の値を変えます.
2.工場モード
ECMAScriptではクラスを作成できないので、開発者は特定のインターフェースでオブジェクトを作成するための詳細を関数でパッケージ化し、工場モードは非常に直感的で、オブジェクトを作成するプロセスを関数として抽象化し、特定のインターフェースでオブジェクトを作成するための詳細を関数でパッケージ化します.以下の通りです
function createPerson(name, job) {
     
   var obj = new Object();
   obj.name = name;
   obj.job = job;
   obj.getName = function () {
     
       alert(this.name);
   }
   return obj;
}
var p1 = createPerson('    1', 'html1');
var p2 = createPerson('    2', 'html2');
通俗的には、工場モードとは、作成対象の語句を一つの関数に置き、パラメータを入力して特定のオブジェクトを作成し、最後に作成したオブジェクトに戻ります.関数createPerson()は、受け入れられたパラメータに基づいて必要なすべての情報を含むPersonオブジェクトを構築することができる.この関数は何度も呼び出すことができますが、毎回2つの属性と1つの方法を含むオブジェクトを返します.短所:工場モードは似たような対象を複数作成することができますが、対象の標識の問題を解決できません.つまり、どのように一つの対象のタイプを知っていますか?コンストラクターモードが生まれます.
3、コンストラクタモード
構造関数モードはjava言語でオブジェクトを作成するための一般的な方法です.二つの言語は構造関数でオブジェクトを作成する方法が少し違っています.違いに注意してください.JavaScriptにはクラスの概念がなく、関数は一等公民です.したがって、あるクラスを明示的に声明する必要はなく、直接構造関数を作成すればいいです.クラスの方法と属性は構造関数(またはプロトタイプオブジェクト)で処理されます.コンストラクターモードを使用して、前の例を次のように書き換えます.
function Person(name, job) {
     
   this.name = name;
   this.job = job;
   this.getName = function () {
     
        alert(this.name);
   }
}
var p1 = new Person('    1', 'java');
var p2 = new Person('    2', 'php');
注意深い友達はきっとコンストラクションの関数名の頭文字が大文字であることを発見しました.普通の関数の頭文字は小文字です.これは多くのOO言語が決められた決まりです.大部分の場合は大文字でなくても間違いないですが、コードの規格性と可読性のために、やはりコンストラクションの頭文字を大文字にして、普通の関数と区別します.工場モードと比較して、構造モードでオブジェクトを作成するには、以下の点があります.
  • は、オブジェクト
  • を表示せずに作成する.
  • 直接に属性と方法をthisオブジェクト
  • に割り当てる.
  • リセット文がありません.
  • さらに、Personを作成するためには、newオペレータを使用しなければならず、作成された例示的なオブジェクトは、Personコンストラクタ属性を有し、Personコンストラクタを指すことに留意されたい.コンストラクタを呼び出してオブジェクトを作成するには、次のいくつかのプロセスがあります.1.新しいオブジェクトを作成します.2.コンストラクタのスコープを新しいオブジェクトに割り当てます.3.コンストラクタのコードを実行します.コンストラクタを使用する主な問題は、各方法が各インスタンスにわたって作成されます.ECMAScriptでは、関数は対象となりますので、関数を定義するごとにオブジェクトを実例化しました.以下の例はこの欠点を証明している.
    var p3 = new Person('  ','html');
    var p4 = new Person('   ','hmtl');
    p3.getName();
    p4.getName();
    console.log(p3.getName == p4.getName);
    
    つまり、コンストラクタによって実装された複数のオブジェクトの方法は、複数の異なる方法であるが、それらの内部コードと実装機能は同じであり、これは一定の資源の浪費をもたらしている.幸いにも、この問題はプロトタイプで解決できます.
    4、原型モード
    jsでは、各関数にプロトタイプ属性があり、オブジェクトを指すポインタであり、プロトタイプオブジェクトと呼ばれ、プロトタイプオブジェクトは、特定のタイプのすべてのインスタンスオブジェクトによって共有できる属性と方法を含む.また、このオブジェクトには、生自来也との属性constructorがあり、作成対象の構造方法を指しています.プロトタイプパターンを使用して、すべてのインスタンスにプロトタイプオブジェクト内の属性および方法を共有することができ、すなわち、再構築関数においてオブジェクトインスタンスを定義する情報は必要ない.コードで下記を表します.
    function Person(){
           }
    Person.prototype.name = 'Claiyre';
    Person.prototype.sex = 'female';
    Person.prototype.class = 5;
    Person.prototype.getName = function (){
         
          console.log(this.name);
    }
    var p5 = new Person();                                                         
    p5.getName();    //Claiyre
    var p6 = new Person();
    p6.getName();    //Claiyre
    
    プロトタイプを知ると、インスタンスオブジェクトに属性または方法を追加し続けることができます.
    p6.name = 'John';                                                     
    p6.getName();       //John
    
    あるオブジェクトの属性を読み取る場合、一度に検索が行われます.まず、オブジェクトのインスタンス自体から検索が開始されます.インスタンスでこの属性が見つかったら、検索は終了し、インスタンス属性の値を返します.例が見つからない場合は、オブジェクトのプロトタイプオブジェクトに続き、オブジェクトのプロトタイプオブジェクトを検索します.プロトタイプオブジェクトに見つかったら、プロトタイプに該当する属性の値を返します.見つけられない場合はundefinedに戻ります.したがって、インスタンスオブジェクト属性は、元のオブジェクトの同名属性をカバーするので、上の2行目のコードがジョンに出力されます.Object.get ProttypeOf方法はパラメータオブジェクトの原型オブジェクトを返します.Object.keysメソッドは、対象授業の列挙の実例となる属性を返します.
    モデルにも欠点がないわけではない.まず、構造関数のための初期化パラメータの転送は省略され、結果はすべてのインスタンスがデフォルトで同じ属性値を取得します.これはある程度不便をもたらすが、原型の最大の問題ではない.プロトタイプの最大の問題は共有の本性によるものである.プロトタイプのすべての属性は多くのインスタンスで共有されており、この共有は関数にとって非常に適切である.基本値を含む属性については逆説する過去に、同じ名前の属性をインスタンスに加えることで、プロトタイプの対応する属性を隠すことができます.そして、引用タイプを含む属性については、問題が顕著になります.
    Person.prototype.friends = ['aa','bb'];
    
    console.log('p6   ' + p6.friends);
    p5.friends.push('cc');
    console.log('p5   ' + p5.friends);
    console.log('p6   ' + p6.friends);
    
    問題が来ました.私たちはp 5の友達リストを変えたいだけですが、モデルの共有の本質のため、p 6の友達リストも変わりました.したがって,プロトタイプモードは単独ではあまり使われない.
    5、コンストラクタモードとプロトタイプモードを組み合わせる
    コンストラクタモードとプロトタイプモードを組み合わせて使用することは、ユーザー定義のタイプを作成する最も一般的な方法である.コンストラクターモードは例示的な属性を定義するために使用され、プロトタイプモードは方法と共有の属性を定義するために使用される.結果として、各インスタンスは、自分のインスタンス属性のコピーを持っていますが、同時に方法の参照を共有し、メモリを最大限に節約しました.
    function Person(name,age,job){
         
        this.name= name;
        this.age = age;
        this.job = job;
        this.friends = ['wang','li'];
    }
    
    Person.prototype = {
         
        constructor:Person,
        getName : function(){
         
            alert(this.name);
        }
    }
    
    var p1 = new Person('zhang',26,'java',);
    var p2 = new Person('sun',25,'php');
    
    p1.friends.push('zhao');
    alert(p1.friends);  //'wang,li,zhao'
    alert(p2.friends); //'wang,li'
    alert(p1.friends === p2.friends);  //false
    
    上記の例では、例示的な属性はすべて構造関数で定義されているが、全てのインスタンスで共有される属性constructtorと方法getNameはプロトタイプで定義されている.p 1.friendsを修正しました.彼らはそれぞれ異なる配列を引用しています.
    その他のモード
    動的プロトタイプモード:最初にコンストラクタを呼び出した時にのみ、方法をプロトタイプオブジェクトの対応する属性に割り当て、他の例の処理方式はコンストラクタモードに寄生するコンストラクタモードと同じである.オブジェクトのコードだけをカプセル化し、新たに作成したオブジェクトに戻っても、newオペレータを使用して安定なコンストラクタモードを呼び出す.プライベート変数と方法だけでなく、いくつかのget/set方法でプライベート変数を処理します.
    おわりに
    各モードにはそれぞれの長所と短所があります.具体的にはどちらを使うかは、実際のシーンに合わせて、深く理解し、柔軟に運用する必要があります.