JavaScript対象プログラミング入門教程


対象となるJavaScriptは他の言語と比べて差があり、それによっていくつかの論争を引き起こしたが、JavaScriptは強力な対象向けプログラミング能力を持っている。ここではまず対象向けプログラミングを紹介してから、JavaScriptの対象モデルを振り返って、JavaScriptの対象向けプログラミング概念を一番後に実証する。
JavaScript回顧
変数(variables)、タイプ(types)、関数(functions)、スコープ(scope)などJavaScriptの概念に対して心細いと感じたら、JavaScriptの中のこれらのテーマを読み直して紹介してもいいです。JavaScript 1.5コアガイドを調べて対象に向かってプログラミングすることもできます。
オブジェクト指向プログラミングは、実際の世界に基づくモデルを作成する抽象的なプログラミングモデルです。これはいくつかの以前に確立されたモデル技術を使用して、モジュール化(modularity)、多状態(polymorphism)、およびパッケージ化(encapulation)を含む。今日、多くの流行しているプログラミング言語(Java、JavaScript、C+、Python、PHP、Rubry、およびObjective-Cなど)は対象向けプログラミング(OOP)をサポートしています。オブジェクト指向プログラミングは、協力オブジェクトのセットを使用してソフトウェア設計を行うものと考えられ、これは従来の観点とは対照的に、従来の観点では、プログラムを関数セットとして扱うか、またはコンピュータ命令リストに簡略化する。オブジェクト指向プログラミングでは、各オブジェクトは、メッセージを受信し、データを処理し、他のオブジェクトにメッセージを送信する能力を有する。各オブジェクトは独立した役割や責任を持つ小さなマシンと見なすことができます。オブジェクト指向プログラミングは、プログラミングのより大きな柔軟性とメンテナンス性を向上させることを目的とし、大規模なソフトウェアエンジニアリングで広く流行しています。モジュール化が非常に重視されているので、対象コードは、開発をより簡単に、後で理解することを目的としており、モジュール化されたプログラミング方法が少ないことに対して、複雑な状況及びステップの分析、符号化、理解をより直接的にすることができる。
専門用語
クラス(Class)~定義対象の特徴(characteristics)。オブジェクト(Object)〜クラスのインスタンス(Instance)。属性(Property)~オブジェクトの特徴(characteristic)は、例えば色です。方法(Method)~あるオブジェクトの能力、例えば歩くこと。コンストラクタ~実装時に呼び出す方法です。継承(Inherityance)~1つのクラスは、他のクラスからの特徴を継承することができます。パッケージ(Encapulation)〜1つのクラスはこのオブジェクトの特徴だけを定義し、一つの方法はこの方法だけを定義してどのように実行しますか?抽象(Abstraction)~ある対象の複雑な継承、方法、属性を結びつけて、ある現実モデルをシミュレートすることができます。多状態(Polymorphism)〜同じ方法または属性を定義する場合があります。オブジェクト指向プログラミングの詳細については、ウィキペディアのオブジェクト指向プログラミングフレーズを参照してください。
原型に基づくプログラミング
プロトタイプベースのプログラミングは、オブジェクト指向のプログラミングスタイルで、クラスは存在しません。行動再利用(クラスベースの言語では継承といいます)は、粉飾を通じてプロトタイプの既存のオブジェクトとして完成されます。このようなモードは、無類のプログラミング、プロトタイプ向けのプログラミング、またはインスタンスベースのプログラミングとも呼ばれる。プロトタイプ言語に基づく最初の例は、David UgarとRandall Smithによって開発されたSelfプログラミング言語である。しかし、このような種類のないプログラミングのスタイルは最近ますます人気があり、いくつかのプログラミング言語に採用されています。例えば、avaScript、Ccil、NewtoScript、Io、MOO、REBOL、Kevo、Squeak(Viewerフレームを使ってMorphicコンポーネントを操作する場合)、および彼のいくつかの言語があります。
JavaScriptは対象に向かってプログラミングします。
コアオブジェクト(Core Object)
JavaScriptにはいくつかのコアに含まれているオブジェクトがあります。例えば、Math、Object、Aray、およびStringなどのオブジェクト。以下の例は,MathオブジェクトのRandom()法を用いて乱数を取得する方法を示す。

alert(Math.random());
は、本例および他の例のすべてが、ウェブブラウザに含まれるalertのように、関数名alertがグローバル範囲内に定義されていると仮定して提示する。alert関数は実際にはJavaScript自体の一部ではない。
JavaScriptコアオブジェクトリストは、JavaScript 1.5コア参照:グローバルオブジェクト(Global Object)。 JavaScriptの各オブジェクトがObjectオブジェクトの一例であることを参照し、そのすべての属性と方法を継承する。
カスタムオブジェクト(Custom Object)
クラス(The Class)JavaScriptはプロトタイプに基づく言語で、C++またはJavaなどで見つけられるクラスステートメントは含まれていません。時々、これらはいくつかの種類のステートメント言語に慣れているプログラマーを困惑させます。ただし、JavaScriptは関数でクラスとします。クラスを定義するのは簡単で、関数を定義することです。次の例では、Person(人)という新しいクラスを定義します。
function Person() { }
オブジェクト(クラス例)(The Object)は、後にアクセスするために、Objオブジェクトの新しいインスタンスを作成します。次の例では、まずPersonというクラスを定義し、その後、二つのインスタンス(person 1とperson 2)を作成する。
function Person() {}
var person1 = new Person();
var person2 = new Person();
新しい例示的な代替方法Object.createも参照することができる。コンストラクター
実装時(オブジェクトインスタンスを作成した瞬間)は、コンストラクタを呼び出します。コンストラクタはクラスの一つの方法です。JavaScriptでは、そのオブジェクトのコンストラクターとして機能します。従って,構造関数法を明示的に定義する必要はない。クラスで宣言された各行為は、実装時に実行されます。コンストラクタは、オブジェクトの属性または呼び出し方法を設定するために使用されます。本論文では、異なる文法を使用して、クラス方法とその定義を追加します。次の例では、Personを実装すると、Personクラスのコンストラクターが警告ボックスを表示します。
function Person() {
    alert('Person instantiated');
}
var person1 = new Person();
var person2 = new Person();
属性(オブジェクト属性)(The Property)
属性はクラスに含まれる変数です。各オブジェクトのインスタンスにはこれらの属性があります。属性はクラス(関数)の原型属性に設定し、正常な動作を継承します。クラスでの操作属性は、thisキーによって達成され、thisは現在のオブジェクトを参照します。クラスの外部へのアクセス(読み書き)は、次の構文で行います。Instance Name.Property。これはC++、Java、その他のいくつかの言語で使われている文法と同じです。クラス内では、属性値を取得または設定するために、this.Proptyのシンタックスを使用する。次の例では、Personクラスのためにgender(性別)属性を定義し、初期化時にこの属性を定義する。
function Person(gender) {
    this.gender = gender;
    alert('Person instantiated');
}
var person1 = new Person('Male'); // Male:
var person2 = new Person('Female'); // Female:
// person1
alert('person1 is a ' + person1.gender); // person1 is a Male
方法(The methods)方法は、属性と同じ論理に従う。違いはそれらが関数であり、関数として定義されることです。コール方法はアクセス属性と似ていますが、メソッド名の末尾に()を追加するとパラメータがあります。一つの方法を定義すると、このクラスのプロトタイプ属性の名前付き属性に関数を指定します。関数が割り当てられたその名前は、オブジェクトにそのメソッドの名前を呼び出すことです。次の例では、私たちはPersonクラスのためにsayHello()方法を定義して使用する。
function Person(gender) {
    this.gender = gender;
    alert('Person instantiated');
}
Person.prototype.sayHello = function() {
    alert('hello');
};
var person1 = new Person('Male');
var person2 = new Person('Female'); // Person sayHello 。
person1.sayHello(); // hello
JavaScriptでは、方法は属性として、あるクラス/オブジェクトに結び付けられている通常の関数オブジェクトであり、これは、コンテキストから逸脱することができるという意味である。以下の例のコードを考慮して、

function Person(gender) {
    this.gender = gender;
}
Person.prototype.sayGender = function() {
    alert(this.gender);
};
var person1 = new Person('Male');
var genderTeller = person1.sayGender;
person1.sayGender(); // alerts 'Male'
genderTeller(); // alerts undefined
alert(genderTeller === person1.sayGender); // alerts true
alert(genderTeller === Person.prototype.sayGender); // alerts true
この例は、複数の概念を示している。これはJavaScriptには「オブジェクトベースの方法」がないことを示しており、この方法のすべての参照は完全に同じ関数、すなわち最初にプロトタイプで定義したその関数を指すからである。ある関数がメソッド(または属性)として呼び出されると、JavaScriptは現在のオブジェクトコンテキスト(object context)を特定の「this」変数にバインドする。これは、関数オブジェクトを呼び出す「call」方法と同等であり、以下のように示されている。
詳細については、Function.callFunction.applyを参照してください。
継承(イノセンス)
継承は、1つまたは複数のクラスの専用バージョンとしてクラスを作成する方法である(JavaScriptは単一クラスのみの継承に対応します)。この専用類は通常サブクラスと呼ばれ、他の類は通常親類と呼ばれています。JavaScriptでは、相続を完了するには、親の例をサブクラスに割り当て、サブクラスを特化する必要があります。
ヒント:JavaScriptが検出していないサブクラスのプロトタイプ.com nstructor(プロトタイプのコンストラクタ)はCore JavaScript 1.5コア参照:Global Object:Object:prototype属性を参照しているので、手動で値を指定しなければなりません。
次の例では、StudentクラスをPersonのサブクラスとして定義します。その後、sayHello()方法を再定義し、sayGoodBye()方法を追加します。

genderTeller.call(person1); //alerts 'Male'e
パッケージ
上記の例では、Studentは、Personクラスのwalk()方法がどのように実現されるかを知らないが、それでもこの方法を使用することができる。Studentクラスは、この方法を明示的に定義する必要がないので、それを変更したい場合を除きます。これをパッケージと呼び、各クラスがその親の種類を継承する方法で、変化したいものだけを定義します。
抽象的
抽象的なメカニズムは、処理中の問題の現在の部分のモデリングを可能にする。これは、継承(特化)または組合せ(compsition)によって達成され得る。JavaScriptは、クラスインスタンスを他のオブジェクトの属性値にすることによって、特別化を実現する。JavaScriptのFunctクラスはObjectクラスから継承され、Function.prototype属性はObjectの例である。

// Person
function Person() {}
Person.prototype.walk = function() {
    alert('I am walking!');
};
Person.prototype.sayHello = function() {
    alert('hello');
};
// Student
function Student() {
    //
    Person.call(this);
}
// Person
Student.prototype = new Person(); // , Person
Student.prototype.constructor = Student; // sayHello
Student.prototype.sayHello = function() {
    alert('hi, I am a student');
}
// sayGoodBye
Student.prototype.sayGoodBye = function() {
    alert('goodBye');
}
var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye(); //
alert(student1 instanceof Person); // true
alert(student1 instanceof Student); // true
多形
すべての方法と属性がプロトタイプの属性内に定義されるように、異なるクラスは同じ名前を持つ方法を定義することができる。方法のスコープは、それらのクラスを定義することに限られる。これは二つの種類の間に親子関係がない場合(一つの種類が相続チェーンの中の他の類から引き継がれていない場合)だけが真実です。
ヒント
本論文で提示されたオブジェクト指向プログラミング実現技術はJavaScriptだけでなく、オブジェクト指向プログラミングの方法についても非常に柔軟である。同様に、ここに展示されている技術は、言語技術を一切使用していないし、他の言語を模倣した対象理論も実現されていない。JavaScriptの中には、他にももっと高級なオブジェクト向けプログラミングの技術がありますが、それらの内容はこの紹介記事の範囲を超えています。