JAVSCRIPT対象(作成対象)第二章
6050 ワード
Objectのコンストラクションや文字の量でオブジェクトを作成しますが、大量の重複コードが発生します.コードはメンテナンスされていません.
工場モード
ECMAScriptはクラスを作ることができませんので、工場モードでオブジェクトを作ることができます.パッケージオブジェクトとしても使えます.
function createAnimal(name,age){
var o = new Object();
o.name = name;
o.age = age;
o.bark = function(){
console.info(this.name);
}
return o;
}
var dog1 = createAnimal("Small Yellow",5);
var dog2 = createAnimal("Big Yellow",25);
注意:工場モードは対象を作成することができますが、対象識別問題を解決できません.コンストラクタモード
ObjectやArayのようなオリジナルのコンストラクタが実行環境に出現します.また、カスタムのコンストラクタを作成し、コンストラクタを使って上記の例を再実現します.
function Animal(name,age){
this.name = name;
this.age = age;
this.bark = function(){
console.info(this.name);
}
}
var dog1 = Animal("Small Yellow",5);
var dog2 = Animal("Big Yellow",25);
この例では、Animalは工場モデルのcreateAnimal関数に取って代わられていますが、このような原生サポートの関数は工場モデルと異なるところが三つあります.このとき、同じ関数で生成されたオブジェクトのタイプは一致しています.
console.info((dog1.constructor == dog2.constructor) && (dog1.constructor == Animal) && (dog2.constructor == Animal));//true
対象のタイプをチェックするなら、instance ofの方がいいです.console.info(dog1 instanceof Object);//true
console.info(dog2 instanceof Object);//true
console.info(dog1 instanceof Animal);//true
console.info(dog2 instanceof Animal);//true
注意:dog 1とdog 2は同時にObjectのサブクラスであり、この原理は原型継承であり、第三章では詳細な答えが出されます.構造関数と普通関数の違い
実は、コンストラクタは普通の関数と何の違いもありません.コール方式の違いだけです.つまり、どの関数もnewで呼び出すことができますが、これはビジネスシーンの意味を失う可能性がありますので、どのように呼び出しますか?具体的な違いは次の例の中に一つ一つ現れます.
// new
var dog = new Animal("Small Yellow",5);
dog.bark();//"Small Yellow"
// ,
Animal("Small Yellow",5);// window
window.bark(); //"Small Yellow"
//
var o = new Object();
Animal.call(o,"Small Yellow",5);//o call Animal , apply ,
o.sayName(); //"Small Yellow"
コンストラクタに存在する弊害ここに言及して、知識を事前に強化しなければならなくて、すべての関数はすべてFunctionの実例です.オブジェクトを作成する時、newでコンストラクションを調整します.呼出するたびに、Animal内部コードは一回実行されます.ここのthis.barkは同じ関数ではありません.したがって、異なる実例における同名の関数参照は異なる.
console.info(dog1.bark == dog2.bark);//false
しかし、このような問題があったら、私たちは関数を外部に書くことで、こんな難しい問題を解決できます.それは弊害があって、共有のbarkは同一の引用ですが、このように全体の作用の領域の上で方法を定義して、このように多くの大域の関数をもたらすことができて、後で維持しにくいです.どうやってこの問題を解決すれば、次は原型モードに入りますか?function Animal(name,age){
this.name = name;
this.age = age;
this.bark = bark;
}
function bark (){// , ,
console.info(this.name);
}
var dog1 = new Animal("Small Yellow",5);
var dog2 = new Animal("Big Yellow",25);