オブジェクトを作成し
、多くのオブジェクトが同じインターフェイス、重複した大量のコードを使用して作成:Objectコンストラクタまたはリテラルのオブジェクトが単一のオブジェクトを作成するために使用することができ、これらの方法には重大な欠点を持っていますが。
・工場出荷時のモデル
工場・モデルは、オブジェクトを作成するための具体的なプロセスを抽象化し、よく知られた設計モデルです。ECMAScriptのクラスを考慮して作成することができ、開発者が機能パッケージで、機能を発明
特定のインタフェースオブジェクトの詳細作成する
//コードを...
関数createPerson(名前、年齢、仕事){ VARの O = 新しいオブジェクト(); o.name = 名前; o.age = 年齢; o.job = 仕事。 o.sayName = 関数(){ にconsole.log(この.nameの)。 } 戻りO; } VARの人物= createPerson( "トム"、25、 "コーダ" )。 console.log(人)。 // {名: "トム"、年齢:25、仕事: "コーダ"、sayName:ƒ}
ファクトリモードは、複数の類似したオブジェクトを作成する問題を解決するが、JSの開発で、(つまり、オブジェクトの種類を知る方法、である)物体認識の問題を解決していませんが、また、新モデルの登場
-constructorモード
はECMAScriptでコンストラクタは、オブジェクトの特定のタイプを作成するために使用することができます。オブジェクトのように、実行時にアレイなどのネイティブコンストラクタは、それが自動的に実行環境に表示されます。さらに、あなたは可能
プロパティとメソッドのカスタムタイプを作成するカスタムコンストラクタを作成
//コードを..
機能人数(名前、年齢、職業){ この .nameの= 名; この .age = 年齢; この .JOB = ジョブ; この .sayName = 関数(){ にconsole.log(この.nameの); } } VAR person_a = 新しい新しい人( 'リー'、33は、 '医者'です;) はconsole.log(person_a); // 人{名: "リー"、年齢:33は、ジョブ: "ドクター"、sayName:ƒ} のvar person_b = 新しい新しい人(「王」、22は、「モデル」である); // 両方のオブジェクトは、コンストラクタ(コンストラクタ)の性質を持って、人を持っています。 console.log(== person_a.constructor人); // trueに // オブジェクトのconstructorプロパティ最初に同定されたオブジェクトのタイプ。しかし、オブジェクト検出の種類に言及、またはinstanceofはオペレータはより信頼性がある にconsole.log(person_a のinstanceof ;人) // trueに はconsole.log(person_a のinstanceofオブジェクト); // trueに //が、我々はこのケースで作成し、描画することができますすべてのオブジェクトはインスタンスオブジェクトPersonインスタンスの両方されて //は、 カスタムのコンストラクタを作成し、それが特定のタイプとして、将来的にインスタンスを識別できることを意味し、これは、コンストラクタモードは工場出荷時のパターンの場所よりも優れています。で // すべてのオブジェクトがObjectから継承されているので、この場合、person_aとperson_b理由は、また、オブジェクトのインスタンスです。 console.log(person_a.sayName == person_b.sayName); // falseに
この方法では、コンストラクタは、実際には4つの工程を経て行くコール
1.新しいオブジェクトの作成
2、新たなオブジェクトへのコンストラクタの範囲を(したがって、これはオブジェクトを指す)
として(3、コンストラクタコードの実装このオブジェクト属性付加される)
4、新しいオブジェクトを返し
欠点コンストラクタを:
、前の例では、各方法は、各インスタンスに再び再作成するperson_a person_bとsayName()メソッドと命名しているが、二つのこの方法は、同じ機能のインスタンスではありません
。ECMAScriptの機能は、それぞれのオブジェクトをインスタンス化することです機能を、定義し、オブジェクトである---忘れないでください。
明らかに:必要ない同じタスク機能のインスタンスを完了するために2つを作成し、このオブジェクトから、上記のコードを実行する前に、特定のオブジェクトにバインドされた機能を入れないでください。
したがって、これは外部にコンストラクタ関数によって定義され、この問題を解決するには、以下の可能性があり
、//コードを..
関数キャット(){ この .cry = 苗; } 関数ミャオ(){ にconsole.log( "ミャオ~~" )。 } VARの猫= 新しいキャット(); cat.cry(); // ミャオ族~~
外部ミャオ()関数へのポインタthis.cryので、猫のコンストラクタによって作成されたすべてのオブジェクトは、グローバル()関数で定義された同じドメイン苗を共有します。そうすることで解決しない
2つの関数は疑問で同じことを行います。再びできる新しい問題:実際には唯一のグローバルスコープ名は、実際には少しではありませんになり、オブジェクトの関数の定義のグローバルスコープで呼び出すことができます。
さらに容認できないということです:オブジェクトは多くの方法を定義する必要がある場合、その後、我々は、グローバル関数の数を定義していたので、私たちの習慣は、すべてのパッケージの種類を参照していませんでした。
幸いなことに、この問題は、プロトタイプモデルによって解決することができます