JavaScriptの「類」

2096 ワード

JavaScript classes
 
    JavaScriptは機能が強くて優雅な言語で、多くの優れた特徴を持っていますが、一つの特徴はそれが備えられていないので、それはつまり「類」です.少なくともその静的なタイプには古典的な意味がありません.しかし、JavaScriptは健全なオブジェクトプロトタイプシステムを持っています.これも本稿で検討した基礎です.
    始めましょう.以下の簡単なJavaScript関数を考えてみます.
 
function Person( name ){
	this.name = name;
}
 
    上のコードからわかるように、JavaScriptでは、関数はそれらの通常の役割を果たす以外に、JavaScriptのプロトタイプの基礎である.私たちは次のコードを使って新しいPersonのインスタンスを作成できます.
var bob = new Person( "Bob");
var alice = new Person( "Alice");
 
   ここで指摘するのは、ボブはPersonの原型から作成されたオブジェクトである.bob.nameにアクセスすると文字列「Bob」が含まれていることが分かります.bobオブジェクトは、Objectから引き継がれたもの(後に紹介する)のように、いくつかの利用可能な方法を持っている.
   他の古典的な静的なタイプの継承言語(Java,Cピラー)のクラスとは異なり、JavaScriptのプロトタイプは修正可能であり、その各インスタンスはこのような変更を適用する.Personのすべてのインスタンスにgreet()の方法があると仮定すると、以下のコードで目的を達成することができる.
Person.prototype.greet = function( otherPerson ){
	alert( "Hello " + otherPerson.name + ", I'am " + this.name );
}
   今私たちはお互いに挨拶できるPersonとbobとaliceが二つあります.
bob.greet( alice ); // alerts "Hello Alice, I'm Bob"
alice.greet( bob ); // alerts "Hello Bob, I'm Alice"
   bob.greet()メソッドを呼び出すと、JavaScriptエンジンは以下の位置でgreet関数を検索します.
       1.ボブ自体の属性(ボブ.nameのような)       2.Person.prototypeの属性       3.Object.prototypeの属性
   JavaScriptエンジンは、Person.prototype属性としてのgreetを見つけたら検索しなくなります.また、bob.tostring()を呼び出したら、JavaScriptエンジンを強制的に上の経路に沿って上に検索します.Object.prototypeの中にマッチするものを見つけます.Person.prototypeでtoString()を定義することによって、その動作を再ロードすることもできます.
Person.prototype.toString = function(){
	return this.name.toString();
};
    前に挙げた3つの位置はJavaScriptが動作している時に属性を検索する唯一の場所であり、言い換えれば、対象に向けた言語では親類のサブクラスを作成する方式で継承されていますが、JavaScriptは生まれつきのように原型から原型への継承をサポートしていません.もちろん、JavaScriptも十分に強力であり、フレームやライブラリを使用して、継承モードをカバーすることができます.例えば、1つのプロトタイプのメンバを別のプロトタイプにコピーし、もう1つの高度な方法で、イベントをキャプチャし、特別にメンテナンスされた相続チェーンに沿って検索して、最初の一致する属性を返します.本論文では紹介的な言及だけを行い、これらの2つの方法は本論文の紹介範囲を超えている.
    本文はJavaScriptの中の「類」の入門に集中しています.ここの紹介はいくつかの概念を作り上げて、将来の文章の中で更に深く分析してほしいです.例えば、キーワード「new」の内部作業方式です.