Javascriptコンストラクション関数とprototype実装パッケージ継承


Java、c++のような強いタイプの言語で、タイプはすべてのオブジェクトのテンプレートであり、タイプ定義によってデータと操作を記述(カプセル化)することができる.必要に応じて、タイプは継承、多態変化を拡張することができ、コードの再利用性と可読性がプロセス化プログラミング構文に比べて大幅に向上する.Javascriptもオブジェクト向け言語であり,タイプ定義がない場合にはプロトタイプを定義することでタイプテンプレートを実現する.
Javascriptリファレンスタイプ:Javascript自体は、Function,Object,Boolean,Number,String,Arrayのいくつかの異なる使用タイプを提供しています.
その中でFunctionというタイプが最も特殊で、単独で言わなければならないのは、まずJavascriptのいわゆるタイプがclassではなくfunctionで表されていることを知らなければならない.このタイプの情報自体がオブジェクトである.Javaのタイプやオブジェクトの定義に従って理解するのは容易ではありませんが、
たとえばJavascriptでは、Functionというタイプのオブジェクトを次のように定義します.
function Cat(){
      return 1;
};

このコードではCatは2つの役割を果たし、1つはカスタムタイプCatであり、1つはオブジェクトCatである.CatのタイプはFunctionであり、Catは参照タイプFunctionのインスタンスでもある.
カスタムタイプとしてCatはオブジェクトのテンプレート、つまりコンストラクション関数として機能するが、実際にJavascriptはFunctionタイプを定義することによって他のオブジェクトのテンプレートを作成するしかなく、JavaのClass、Objectという(Function)タイプに相当し、JavaのObjectクラスに相当する.例:new Object()new Function(); new Array(); したがって、Function、Number、Arrayのタイプは、Object(Function)のサブクラスとみなすことができます.これらの組み込み参照タイプに加えて、キーワードfunction/Function定義タイプも使用できます.上のコードはFunction Catタイプとインスタンスを定義する方法であり、特殊なテンプレート関数Functionを呼び出すことでFunctionのタイプのインスタンスを作成することもできます.
var Cat = new Function("return 1;");

使用上、Catの異なるアイデンティティにもそれぞれ異なる使い方があり、タイプテンプレートとして、var cat=new Cat()などの構造関数としてインスタンスを作成することができます.もちろんインスタンスには実際には独自の属性はなく、すべてObjectインスタンスを継承しています.
Objectインスタンスを作成する方法:var o=new Object() var o  = {}; 
Functionインスタンスを作成する方法:var f=new Function(「return 1」); var f =function(){return 1;}
Object.constructor==Function,Objectのコンストラクション関数は実際にFunctionメソッドなのか
つまり、すべてのインスタンスは、コンストラクション関数Functionによって作成されます.
まず、簡単に乱暴なインスタンスを作成します.
  var cat = {name:  'xiaoqi', age: 1};

catを通過する.constructorプロパティまたはcat instanceof Object、catはObject関数によって構築されたインスタンスであり、catのすべてのプロパティはnameとageを除いてサブObject関数を継承します.
上記のコードは、次のように置き換えることもできます.
var cat  =new Object();
cat.name = 'xiaoqi';
cat.age ='1';

Object関数はすべてのオブジェクトの元のテンプレートです
JavaとC++を熟知している開発者が、Object関数がすべてのオブジェクトのテンプレートであることを理解するには、既存の観念を変えなければならない.Javascriptでは、関数は一般的な意味の関数であり、同時に本物のオブジェクトです.したがって、関数内のコードに加えて、オブジェクトとして他の属性を持つこともできます.また、コンストラクション関数として新しいオブジェクトを作成する特別な機能もあります.
function Cat(name, age){
   this.name = name;
   this.age = age;
}																																      Cat("xiaoqi",1);

関数Catが一般的な関数として呼び出されると、それは確かに自分で説明したように、thisが指すオブジェクトの2つの属性を変更しただけです.同時に関数Catもオブジェクトであり、call、apply、prototypeなどの基本的な属性がObjectから継承された重要な属性に使用されます.また、その属性を追加、削除、変更することもできます.したがって、上記のコードも次のように置き換えられます.
Cat.call(this,["xiaoqi", 1]);
これまでCat関数は数職を兼ねていました.つまり、関数であり、オブジェクトであり、その能力はこれだけではありません.
特殊な関数--コンストラクション関数
特殊な関数とは、まったく人を脅かす言い方だ.Cat関数自体は構造関数であり、その書き方は一般的な関数と変わらない.違いは私たちがどのように呼び出すかにある.
function Cat(name, age){
   this.name = name;
   this.age = age;
}

var cat = new Cat("xiaoqi", 1);

Javaに詳しいのはきっと最後の行newキーワードに詳しいに違いないが、ここではclass Catの定義に対応していないよ.すべての奥義はこのCat関数の中にあるようだ.Javascriptにはプロトタイプテンプレートがあり、すべてのオブジェクトのテンプレートがObjectオブジェクトであり、Cat関数が自動的にObjectを継承することを知っています.このコンストラクション関数はObjectをテンプレートとして新しいオブジェクトを作成することができます.この場合、thisは呼び出しの関数ではなく、新しく作成されたオブジェクトを指します.したがって、構造関数でCatにより多くの属性を定義することができます.
function Cat(name, age){
   this.name = name;
   this.age = age;
   this.play =function(){
   }
}

var xiaoqi = new Cat("xiaoqi",1);
var daqi = new Cat("daqi",2);
xiaoqi.play(); 
daqi.play();

そのためfunctionで1つのタイプを表す書き方は、アクセスレベルを考慮しなければJavaのように1行多くclassを書く必要があるよりも簡潔明瞭であり、もちろんJavascriptはJavaの姿になりたくないし、Javaの代わりにもならない.次にオブジェクト向けのもう一つの重要な特性について議論し続けます.
引き継ぐ.
prototypeプロパティによる継承
コンストラクション関数が既に存在する場合:
function Animal(){
	this.run= function(){
	}
}

では、具体的なAnimalタイプを作成するとき、例えばCatは、このAnimalにrunを継承して追加することを望んでいます.Javascriptはprototypeプロパティによって実現されます.
function Cat(name, age){
   this.name = name;
   this.age = age;
}

Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat =new Cat("xiaoqi",1);
cat.play();

実際、なぜCat.prototypeは継承を実現することができ、Catを呼び出すのを見てみましょう.prototype = new Animal(); 時、いったい何があったの?
まず簡単な構造関数を見てみましょう.
function Simple(){
}
//       :
var Simple = new Function("//body");
まずSimpleはタイプFunctionの一例であり、SimpleはデフォルトでFunctionを継承する.prototypeのすべての属性は、newを使用してコンストラクション関数を呼び出す場合、関数体を呼び出して初期化するだけでなく、Function.prototypeは、オブジェクトを新しいインスタンスにコピーすることを指します. 
Simpleはコンストラクション関数であるため、Simpleベースのインスタンスを構築し続けることができます.
var simple = new Simple();

SimpleはSimpleの一例であり、Simple構築関数には初期化コードがなく、すべてのsimpleのすべての属性はSimpleから来ている.prototype. Simple.prototypeはObjectからデフォルトです.prototypeが来ました.すなわち、いずれのFunctionインスタンスのprototype属性もObjectに由来.prototype.
まとめると、いずれのコンストラクション関数もnew呼び出し時に、関数内の初期化コードに加えてprototypeで指すオブジェクトを新しいインスタンスにコピーします.新しいインスタンスがFunctionインスタンスの場合、プロジェクトからprototypeプロパティがデフォルトで継承されます.