ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript Object.extend_js オブジェクト指向

Javascript Object.extend_js オブジェクト指向

WBOY
WBOYオリジナル
2016-05-16 18:27:141066ブラウズ

クラスであるため、抽象クラス、具象クラス、およびクラスの継承が存在します。同時に、クラスのメンバーはインスタンス メンバーと静的メンバーを持つことができます。プロトタイプがこれをどのように行うかを見てみましょう。
まず、プロトタイプ内の次のコードを見てください:

コードをコピーします コードは次のとおりです:

var Abstract = new Object();
Object.extend = function(destination, source) {
for (source のプロパティ) {
destination[property] = source[property];
}
戻り先;
}
Object.prototype.extend = function(object) {
return Object.extend.apply(this, [this, object]); }

最初のメソッドは、オブジェクト Abstract を宣言します。Object は実際にはメンバーを持たないため、空のクラスになります。これについては今は説明しません。これが抽象クラスの基礎であることがわかります。まず、次の構文について説明します。
function.member=function(){}
この場合、一般的に、このステートメントの機能は、静的メンバー member を function に追加することです。は等号の後にあります。たとえば、上記の 2 番目のコード Object.extend=... は、静的メソッド extend を Object クラスに追加します。クラスの静的メンバーを定義する方法はわかったので、次にインスタンス メンバーを定義する方法を知りたいと思います。クラス名とメンバー名の間にプロトタイプを追加します。
function.prototype.member= function() {}
プロトタイプはこのように使用できるだけでなく、次のようにも使用できます。

コードをコピー コードは次のとおりです。
function.prototype={
member1:function(){……},
member2:"abc",
member3:function(){……}
}


これはインスタンスのメンバーの定義を実装します。しかし、プロトタイプとは何を意味するのでしょうか?最初の記事で述べたように、オブジェクトを表すために直接 {} で囲まれます。たとえば、Prototype と Class はこのように定義されたグローバル オブジェクトです。次の使用法を見ると、prototype の後に {} 構造が続いていますが、これもオブジェクトですか?そうです、プロトタイプは実際にはオブジェクトです。 JavaScript では、次の構文を使用して、オブジェクトにメンバーを任意に追加できます:
このように定義されている限り、オブジェクトはすぐに追加できます。この方法はメンバーがいます! JavaScript はとても魔法です!
プロトタイプがオブジェクトであり、関数が関数またはクラスであることがわかりました。プロトタイプは、任意のクラス (関数) によって内部的に保持される静的メンバーと考えることができます。その機能は、このクラスのすべてのメンバー ポインターを格納することですが、これらのメンバーはプロトタイプにすぎず、初期化されていません。これは、プロトタイプの本来の意味にも一致します。プロトタイプ オブジェクトを通じて、いつでもメンバーを拡張できます。新しいクラスの場合、プロトタイプのメンバーが初期化され、インスタンス化されたオブジェクトに割り当てられます。
上記の 3 番目のコードである Object.prototype.extend=... は、インスタンス メソッド extend を Object に追加します。インスタンス メソッドでは、このクラスによってインスタンス化されたオブジェクト自体を指すこのポインターを参照できます。もちろん、このオブジェクトにはメンバー拡張があります。
続行する前に、次の 2 つのステートメントを理解しましょう:
for(var p in object){}
method.apply(object,arguments);
最初の文: 変数メンバーをすべてリストします。関数の場合はすべて静的メンバーであり、オブジェクトの場合はすべてインスタンス メンバーであり、p の型は文字列です。メンバーの名前を示します。 variabel.member を使用してメンバーを参照できるだけでなく、variabel["member"] を使用することもできます。同様に、割り当てについても同様です。これにより、変数のメンバーを列挙するのに非常に便利になります。
2 番目のステートメント: 実行するオブジェクトにメソッドメソッドを適用します。パラメーターは引数の配列です。注: メソッドはオブジェクトのメンバーではありません。ただし、このステートメントの実行は object.method(arguments) を意味すると考えることができます。これは後で頻繁に使用する非常に重要な方法なので、徐々に慣れていきます。
続いて extend を見てみましょう。これは非常に重要なメソッドです。これはクラス Object の静的メンバーでもあり、インスタンス メンバーでもあることがわかります。見てみましょう。宛先とソースの 2 つのパラメータを受け取ります。宛先とソースが両方ともクラスの場合、その機能は、クラスのソースのすべての静的メンバーをクラスの宛先にコピーすることです。がコピーされます。このとき、宛先に同名のメンバーがすでに存在する場合、そのメンバーは上書きされます。つまり、宛先にソースのすべてのメンバーを含めると、関数はこの宛先を返します。 Object のインスタンス メンバーとして extend を見てみましょう:
Object.prototype.extend = function(object) {
return Object.extend.apply(this, [this, object]);
ちょっと頭がくらくらしますが、apply 構文は説明したばかりなので、心配しないでください。呼び出し元はメソッドであり、Object.extend は静的メソッドです。たとえば、obj であると仮定すると、次の角括弧は 2 つのメンバー (this と object) を含む配列になります。この配列は実際には、Object 静的メンバー extend の引数パラメーターです。この場合、このステートメントは
obj.extend(this, object);
this は説明されていませんが、それ自体を表します。オブジェクトとは何ですか?パラメータは、インスタンス メソッド extend によって渡されるパラメータなので、混同しないでください。延長についてはどうですか? obj は extend インスタンスのメンバーを定義しませんが、apply を通じて Object の静的メンバー extend を使用できます。
Object.extend = function(destination, source) {
の関数本体を見てみましょう。 for (source のプロパティ) {
destination[property] = source[property];
return destination;
}
obj はオブジェクトであるため、object もオブジェクトですつまり、宛先と送信元は両方ともオブジェクトであるため、この関数の機能は、obj に object のすべてのメンバーを持たせることです。そしてobjを返します。少しぎこちなく聞こえますが、ロジックは非常に単純です。obj が object から「継承」するようにします。継承については説明しましたが、オブジェクトの継承については、クラス継承のことだと初めて聞きました。そうです、私たちはまだ実際のクラスの継承を見ていませんが、もうすぐそこまで来ています。クラスにはプロトタイプがあるだけではなく、プロトタイプはオブジェクトなのです。
これについて考えると、クラスの継承構文は非常に単純であるように見えます。
b.prototype.extend(a.prototype);
Let b は a を継承します。
しかし、真実はそれほど単純ではありません。prototype にはメソッドのプロトタイプ ポインターが格納されており、extend メソッドは初期化されていないため使用できません。 extend を使用するには、オブジェクトをインスタンス化する必要があります。プロトタイプがどのように作成されるかを見てみましょう:
b.prototype=(new a()).extend(b.prototype);
非常に賢い方法です。関数が実際には変数であることを完全に説明しています。まず a オブジェクトをインスタンス化し、次にそれに基づいて extend を呼び出し、b.prototype のすべてのメンバーを a オブジェクトに上書きしてから、a オブジェクトを b.prototype に割り当てます。aから引き継いだbの仕事が完了しました。実際の使用では、一般的な使用法は次のとおりです。
b.prototype=(new a()).extend({});
b は a から継承するため、通常、クラスの前では b が定義されていないため、クラスのメンバーは実際にはは次の {} で定義されます。もちろん、最初に定義してから継承することもできますが、従来の概念とは異なります。
はい、今日はこれを書いてとても疲れています。これを読んでいる人たちもそうだと思います(笑)。これで、プロトタイプ クラスの開発フレームワークを基本的に理解したので、いくつかの高度なアプリケーションを見てみましょう。また次回:)
コードをコピー コード以下のように: