いくつかの一般的に使用されるオブジェクト作成モード
新しいキーワードで作成します
オブジェクトを作成する最も基本的な方法は、ほとんどの言語が言うことにすぎません。オブジェクトがない場合、新しいものを取得できます。
var gf = new object(); gf.name = "tangwei"; gf.bar = "c ++"; gf.saywhat = function(){console.log(this.name+"sad:love you worever");}リテラルで作成します
これは真実のようですが、オタクはどのようにして変数を定義するこのような複雑で低レベルの方法を好むことができますか?スクリプト言語として、それは他の兄弟と同じスタイルを持つ必要があるため、オブジェクトリテラルを定義する方法が表示されます。
var gf = {name: "tangwei"、bar: "c ++"、fay what:function(){console.log(this.name+"sad:love you worever"); }}工場モデル
実際、これは現実に最も一般的に使用されるオブジェクト定義方法ですが、同様の属性を持つ多くのオブジェクトがある場合はどうすればよいですか(それについて考えるのはエキサイティングです...)? 1つの定義が1つずつ作成されると、大量のコードが生成されます。工場を建設し、大量生産してみませんか?だから、JavaScriptの世界で最初の膨張型の赤ちゃん。 。 。いいえ、「工場モデル」が生まれました!
function creategf(name、bar){var o = new object(); o.name = name; o.bar = bar; o.saywhat = function(){alert(this.name + "sad:love you worever"); } return o;} var gf1 = creategf( "bingbing"、 "d"); var gf2 = creategf( "mimi"、 "a");コンストラクタ
工場のパターンは、複数の類似のオブジェクトを作成するという問題を解決しますが、問題は再び発生します。これらのオブジェクトはすべてオブジェクトによって形成されます。特定の種類のオブジェクトを区別する方法は?現時点では、別のモード、コンストラクターモードに切り替える必要があります。
function gf(name、bar){this.name = name; this.bar = bar; this.saywhat = function(){alert(this.name + "said:love you worever"); }} var gf1 = new gf( "vivian"、 "f"); var gf2 = new gf( "vivian2"、 "f");ここでは、上記の例でcreategfを置き換えるために、大文字から始まるコンストラクターを使用します。コンストラクターの最初の文字は、条約に従って資本化されるべきであることに注意してください。ここでは、新しいオブジェクトを作成し、コンストラクターの範囲を新しいオブジェクトに割り当て、コンストラクターのメソッドを呼び出します。
上記の方法には何も悪いことはないようですが、2つのインスタンスで呼び出されるコンストラクターのSayinghhatshowsは、同じ関数インスタンスではないことがわかります。
console.log(gf1.saywhat == gf2.say what); //間違い
同じ方法を呼び出しますが、異なるインスタンスを宣言することは、リソースの無駄です。コンストラクターの外側のSaywhat Functionのステートメントを最適化できます。
function gf(name、bar){this.name = name; this.bar = bar; this.say what = say what} function seas what(){alert(this.name + "sad:love you worever");}これにより、同じメソッドインスタンスを複数回定義する問題が解決しますが、新しい問題が再び発生します。私たちが定義したことはグローバルな範囲の方法ですが、この方法は直接呼び出すことはできません。これは少し矛盾しています。特定のカプセル化でオブジェクトをよりエレガントに定義する方法は? JavaScriptプロトタイプオブジェクトパターンを見てみましょう。
プロトタイプオブジェクトパターン
プロトタイプオブジェクトを理解します
関数を作成すると、関数にはプロトタイプ属性があります。これは、コンストラクターを介して作成された関数のプロトタイプオブジェクトを指します。素人の用語では、プロトタイプオブジェクトは、他のオブジェクトに共有されたプロパティと方法を提供するメモリ内のオブジェクトです。
プロトタイプモードでは、コンストラクターにインスタンス属性を定義する必要はなく、属性情報をプロトタイプオブジェクトに直接割り当てることができます。
function gf(){gf.prototype.name = "vivian"; gf.prototype.bar = "c ++"; gf.prototype.saywhat = function(){alert(this.name + "sad:love you worever"); }} var gf1 = new gf(); gf1.say what(); var gf2 = new gf();コンストラクターとの違いは、新しいオブジェクトのプロパティとメソッドがすべてのインスタンスで共有できることです。言い換えれば、GF1とGF2は同じプロパティと方法にアクセスします。割り当てた属性に加えて、プロトタイプオブジェクトに組み込み属性もあります。すべてのプロトタイプオブジェクトには、プロトタイプ属性を含む関数へのポインターであるコンストラクター属性があります(あえてポイントを再び回避するかどうか!)。写真を通して、このねじれのプロセスを明確に整理しましょう。
すべてのオブジェクトには、プロトタイプオブジェクト(プロトタイプ)があります。プロトタイプオブジェクトには、プロトタイプ属性を含む関数を指すコンストラクター属性があります。 GFのインスタンスGF1とGF2には、両方ともプロトタイプオブジェクトを指す内部属性が含まれています(ProtoはFirefoxブラウザーのプライベート属性として表示されます)。オブジェクト内の属性にアクセスすると、最初にインスタンスオブジェクトにこの属性があるかどうかを尋ねます。そうでない場合は、プロトタイプオブジェクトを探し続けます。
プロトタイプオブジェクトを使用します
前の例では、プロトタイプオブジェクトにプロパティを追加するときに、それぞれにGF.Prototypeを追加する必要があることに気付きました。この作業は非常に反復的です。上記のオブジェクト作成パターンでは、オブジェクトをリテラルの形で作成できることがわかります。ここではそれを改善することもできます:
function gf(){} gf.prototype = {name: "vivian"、bar: "c ++"、what:function(){alert(this.name+"sad:love you worever"); }}特に注意を払う必要がある場所があります。コンストラクター属性は、関数が定義されるたびにプロトタイプオブジェクトが同時に作成され、このオブジェクトが新しいコンストラクター属性を自動的に取得するため、オブジェクトGFを指すことはありません。この場所では、gf.prototypeを使用して元のプロトタイプオブジェクトを本質的に上書きするため、コンストラクターは新しいオブジェクトのコンストラクター属性にもなり、GFを指すのではなくオブジェクトにもなります。
var gf1 = new gf(); console.log(gf1.constructor == gf); // falseconsole.log(gf1.constructor == object)// true
一般に、この微妙な変化は私たちに影響を与えませんが、コンストラクターに特別なニーズがある場合は、GF.Prototypeのコンストラクタープロパティを明示的に指定することもできます。
gf.prototype = {constructor:gf、name: "vivian"、bar: "c ++"、fay what:function(){alert(this.name+"said:love you worever"); }} var gf1 = new gf(); console.log(gf1.constructor == gf); // trueプロトタイプオブジェクトパターンを予備的に理解することにより、すべてのインスタンスオブジェクトが同じ属性を共有していることがわかりました。これはプロトタイプパターンの基本的な特徴ですが、多くの場合、これは開発者にとって「両刃の剣」です。実際の開発において、私たちが望むインスタンスには、独自の属性が必要な場合があります。これが、実際の開発でプロトタイプパターンだけを使用する人がほとんどいない主な理由でもあります。
コンストラクターとプロトタイプの組み合わせパターン
実際の開発では、コンストラクターを使用してオブジェクトのプロパティを定義し、プロトタイプを使用して共有プロパティとメソッドを定義して、異なるパラメーターを渡して異なるオブジェクトを作成しながら、共有メソッドとプロパティを作成できます。
function gf(name、bar){this.name = name; this.bar = bar;} gf.prototype = {constructor:gf、fay what:function(){alert(this.name + "sad:love you forever"); }} var gf1 = new gf( "vivian"、 "f"); var gf2 = new gf( "vivian1"、 "c");この例では、コンストラクター関数のオブジェクトのそれぞれのプロパティ値を定義し、コンストラクター属性を定義し、プロトタイプオブジェクトの関数を発言して、GF1とGF2属性の間に影響がないようにします。このパターンは、多くのJSライブラリ(ブートストラップなど)で採用されているデフォルトモードを含む、実際の開発で最も一般的に使用されるオブジェクト定義方法でもあります。