ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript オブジェクト指向プログラミングの基礎 Polymorphism_js オブジェクト指向

JavaScript オブジェクト指向プログラミングの基礎 Polymorphism_js オブジェクト指向

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

Javascript はすでにオブジェクト指向のカプセル化と継承機能をシミュレートできますが、残念ながら Javascript のポリモーフィック機能のサポートは非​​常に弱いです。他のオブジェクト指向言語のポリモーフィズムは、通常、メソッドのオーバーロードと仮想メソッドによって実現されます。JavaScript もこれら 2 つのメソッドによってポリモーフィズムを実装します。

オーバーロード: Javascript は型指定が弱く、変数パラメーターをサポートしているため、オーバーロードされたメソッドを定義する場合、インタープリターはパラメーターの型とパラメーターの数によって異なるオーバーロードされたメソッドを区別できないため、メソッドのオーバーロードはサポートされません。同じ名前のメソッドが連続して定義されている場合、最初に定義されたメソッドは後から定義されたメソッドによって上書きされます。

インタプリタはオーバーロードされたメソッドを区別できないため、異なるメソッドを手動で区別します。

コードをコピー コードは次のとおりです。

var MyClass=function(){
var AddNum=function(a,b){
return a b;
}
var AddString=function(a ,b ){
return "ここにいます" a b;
}
this.Add=function(a,b){
if(typeof(a)=="number")
return AddNum(a,b);
else
return AddString(a,b);
}
}
var MyObj = new MyClass(); (5,6);
var Y = MyObj.Add("A","FFFFFF"); //結果: 11
alert(Y);私はここにいますAFFFFFF


仮想メソッド:


function BaseClass(){
this.Hello=function(){
return this.Say();
}
}
function MyClassA(){
this.Say=function(){
return "Hello";
}
}
function MyClassB(){
this.Say=function(){
return "This is MyClassB";
}
}
MyClassA.prototype = new BaseClass();
MyClassB.prototype = new BaseClass();
var ObjA = new MyClassA();
var XX = ObjA.Hello();
alert(XX); //結果: こんにちは
var ObjB = new MyClassB();
var YY = ObjB.Hello(); YY ; 仮想メソッドに相当し、ポリモーフィズムをシミュレートできます。

js のオーバーロードと書き換え (上書き):
オーバーロードとは、「同じ名前の関数 (関数も含まれることに注意) またはメソッドは複数の実装を持つことができ、それらはパラメーターに依存する」ことを意味します。パラメータのタイプおよび/または数。」そして、オーバーライド(オーバーライド)とは、「サブクラスは、親クラスと同じ名前、同じパラメータの型と番号を持つメソッドを定義できます。これらのメソッドが定義された後、サブクラスのインスタンス化オブジェクト内に、親クラスのこれらのメソッドが定義されます」から継承された同じ名前のメソッドは非表示になります。」過負荷を意味する英語はオーバーロード、カバレッジを意味する英語はオーバーライドです。さて、これがコンセプトの紹介ですが、私が何を言おうとしているかわかりますか?へー、コードは安いです。リロードされたコードを見てください:


コードをコピーします


コードは次のとおりです: }
return sum;
関数 test() {
alert(add()); 1 , 2 ));
alert(add( 1 , 2 , 3 ));
}


これにより、複数のパラメーターの追加のオーバーロードが実現されます。関数。もちろん、instanceof またはコンストラクターを使用して関数内の各パラメーターの型を決定し、後で実行する操作を決定し、より複雑な関数またはメソッドのオーバーロードを実装することもできます。つまり、JavaScript のオーバーロードは、ユーザー自身が argument 属性を操作して関数内に実装します。引数の特徴については、以前に簡単に紹介しましたので、私の記事 http://blog.csdn.net/zhanglingdll_39/archive/2009/08/20/4465670.aspx を参照してください。
以下では、JS 書き換えの実装の理解に重点を置いています。
// 静的メソッドの継承をクラスに追加するということは、特定のクラスから継承することを意味します
Function.prototype.inherit = function (baseClass) {
for ( var p in baseClass.prototype) {
this .prototype[p] =baseClass.prototype[p]
}
}
// js 実装 rewrite
functionparentClass() { // 親クラス
}
parentClass.prototype.method = function () {
alert( "parentClass メソッド " );
}
function subClass() { // サブクラス
}
//



コードをコピー


コードは次のとおりです:

次の文は、subClass.prototype = newparentClass();
subClass.inherit(parentClass);
// subClass.prototype.method = function() { // サブクラスの書き換えと同等です。親クラスのメソッド - コメントを削除して実行してみます。
//alert("subClass method")
// }
function test() {
var obj = new subClass( ); ;
obj.method();
}
このように、サブクラスで定義されたメソッドは、親クラスから継承されたメソッドをオーバーライドします。サブクラスで親クラスのメソッドを呼び出すにはどうすればよいのかと疑問に思うかもしれません。さて、次のように実装を見てみましょう:
// 静的メソッドの継承をクラスに追加するということは、特定のクラスから継承することを意味します
Function.prototype.inherit = function (baseClass) {
for ( var p inbaseClass.prototype) {
this .prototype[p] =baseClass.prototype[p];
}
}
/* 参考記事:http://menjoy.javaeye.com/blog /127847 */
//js 実装は
functionparentClass() {
this .method = function () {
alert( "parentClass method " );
} を書き換えます
function subClass () {
var メソッド = this .method;
this .method = function () {
method.call( this );
alert( " subClass メソッド " );
}
}
subClass.prototype = newparentClass();
// subClass.inherit(parentClass); //この文は前の文と同等のようです subClass.prototype = newparentClass (); でも実際そうなの? ? ? ? (前の行をコメントし、この行を実行して確認します)
subClass.prototype.constructor = subClass;
function test() {
var obj = new subClass();
obj.method() ;
}

これでポリモーフィズムの紹介は終わりです。 JS オブジェクト指向プログラミングは広大な海のようなものです。他の人の記事を参考にして書いた JS オブジェクト指向プログラミングの 3 つの基本は、初心者が学ぶための参考としてのみ使用できます。学びに終わりはありません。インターネット上の専門家が書いた素晴らしい記事をいくつか参考にしました。理解の段階を超えた読者には、専門的な記事を読んだ方がよいでしょう。庭の専門家によって書かれた記事。まずは庭園の専門家に感謝したいと思います。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。