長い間 (ここでほくそ笑んでいたいのですが)、js は「フォーム検証などの非常に限られた機能を完了する一種の飾りであり、その言語自体は手続き型言語とみなされてきました。複雑な機能を完了します。」しかし、(苦々しく悲しいことを言いたいのですが)、「Ajax の出現により、複雑なスクリプトが必要なコンポーネントになり、JavaScript プログラミングの新しい要件が提示されました。多くの Ajax アプリケーションは JavaScript を使用し始めました。オブジェクト指向のプロパティは、実際、JavaScript はオブジェクト指向開発のアイデアを実装するための完全なメカニズムを提供します。」なんてことだ、私は学びたくなかったし、学ぶ勇気もなかったが、今は覚悟を決めて学ばなければならない。
ここにはオブジェクトに関するナンセンスがたくさんあります。オブジェクト指向プログラミングの 3 つの主な特徴は、カプセル化、継承、ポリモーフィズムであることは誰もが知っています。以下に、これら 3 つの特性に関するいくつかの学習体験を記録します。
さて、カプセル化から始めましょう。ご存知のとおり、オブジェクトはカプセル化の最も基本的な単位です。カプセル化により、プログラムの相互依存関係によって引き起こされる変更の影響が防止されます。オブジェクト指向のカプセル化は、従来の言語のカプセル化よりも明確で強力です。コードは簡単です。 簡単なコードを見てみましょう。
// 関数を定義してクラスを定義します。
function class1() {
// クラスのメンバーとコンストラクターの定義
//ここで、class1 は関数とクラスの両方です。関数としては、初期化を担当するクラスのコンストラクターとして理解できます。
}
// new 演算子を使用してクラスのインスタンスを取得します
var obj = new class1();
/* クラスの概念は置いといて、次の形式からコードでは、class1 は関数なので、すべての関数を new で操作できますか?答えは「はい」です。
JavaScript では、関数とクラスは同じ概念です。関数が新しい場合、オブジェクトが返されます。この関数に初期化されたクラス メンバーがない場合は、空のオブジェクトが返されます。
実際、新しい関数の場合、この関数は表現されたクラスのコンストラクターであり、その関数内のすべてのコードはオブジェクトを初期化するために動作しているとみなすことができます。クラスを表すために使用される関数はコンストラクターとも呼ばれます。
JavaScript では、各オブジェクトは複数のプロパティ (メソッド) のコレクションとして見ることができます。
*/
function test() {
alert( typeof (obj)); }
上記のコードは、js での単純なカプセル化であるクラス class1 を定義します。js が「静的クラス」である
関数をどのように定義するかを見てみましょう。 class1() { // コンストラクター
}
// 静的プロパティ
class1.staticProperty = " test " ;
// 静的メソッド
class1.staticMethod = function () {
alert(class1.staticProperty);
}
function test() {
// 静的メソッドを呼び出します
class1.staticMethod();
alert( typeof ( class1)) ;
}
次に、「抽象クラス」を見てみましょう:
/*
従来のオブジェクト指向言語では、抽象クラスの仮想メソッドを最初に宣言する必要があります。ただし、他のメソッドから呼び出すこともできます。
JavaScript では、仮想メソッドは、クラス内で定義されていないが、このポインターを通じて使用されているメソッドと見なされます。
従来のオブジェクト指向メソッドとは異なり、ここでの仮想メソッドは宣言する必要がなく、直接使用されます。これらのメソッドは派生クラス
*/
// extend メソッドを定義します。
Object.extend = function (destination, source) {
for (property in)ソース) {
宛先[プロパティ] = ソース[プロパティ];
}
戻り先;
}
Object.prototype.extend = function (object) {
戻りオブジェクト。 extend. apply( this , [ this , object]);
}
// コンストラクターを持たない抽象基本クラスのベースを定義します
functionbase() { }
base.prototype = {
初期化: function () {
this .oninit() // 仮想メソッドを呼び出します
}
}
// class1 を定義します
function class1() {
//コンストラクター
}
// class1 が Base から継承し、oninit メソッドを実装します。
class1.prototype = ( new Base()).extend({
oninit: function () { // を実装します。抽象基底クラスの oninit 仮想メソッド
// oninit 関数の実装
}
});
上記では、「class1 が基底から継承し、それに oninit を実装する」ということがわかります。 』では「継承」という概念が使われているので注目してください。実行結果を見てみましょう。
function test() {
var obj = new class1()
obj.oninit = function () {alert( " test " );
obj.oninit();
}