JavaScriptにおけるオブジェクト指向の深い理解_基礎知識

WBOY
リリース: 2016-05-16 17:14:27
オリジナル
886 人が閲覧しました

JavaScript はオブジェクト指向です。しかし、この点を十分に理解していない人も少なくありません。

JavaScript には 2 種類のオブジェクトがあります。 1 つは「通常のオブジェクト」と呼ばれるもので、数値、日付、ユーザー定義オブジェクト ({} など) など、私たちが一般的に理解しているものです。

「メソッド オブジェクト」と呼ばれる別の型があり、これは通常定義する関数です。奇妙に感じるかもしれません。メソッドは単なるメソッドなのに、なぜオブジェクトになったのでしょうか?しかし、JavaScript ではメソッドは確かにオブジェクトとして扱われます。簡単な例を次に示します。

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

function func( ) {alert('Hello!');}
alert(func.toString());

この例では、func がメソッドとして定義されていますが、それ自体に toString メソッドが含まれています、ここでは func がオブジェクトとして扱われることを示します。より正確に言うと、 func は「メソッド オブジェクト」です。以下は例の続きです:
コードをコピー コードは次のとおりです:

func.name = “I am func.";
alert(func.name);

func の属性を任意に設定できるため、func がオブジェクトであることがさらに証明されます。では、メソッドオブジェクトと通常のオブジェクトの違いは何でしょうか?まず、メソッド オブジェクトは当然実行可能です。これは、メソッド オブジェクトを実行することを意味します。
コードをコピー コードは次のとおりです:

func();

つまり、メソッドオブジェクトには二重性があります。一方では実行でき、他方では通常のオブジェクトとして使用できます。これはどういう意味ですか?これは、メソッド オブジェクトが他のオブジェクトから完全に独立して存在できることを意味します。これを Java と比較してみましょう。 Java では、メソッドはクラス内で定義する必要があり、単独で存在することはできません。これは JavaScript では必要ありません。

メソッド オブジェクトは他のメソッドから独立しているため、任意に参照したり渡したりすることができます。以下に例を示します。

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

function invoke(f ) {
f();
}
invoke(func);

あるメソッド オブジェクト func を別のメソッド オブジェクト invoke に渡し、後者は適切なところで func を実行します。時間。これはいわゆる「コールバック」です。さらに、メソッド オブジェクトの特殊性も、this キーワードの把握を困難にします。この分野には関連記事がたくさんあるので、ここでは詳しく説明しません。

メソッド オブジェクトには、実行されるだけでなく、特別な機能もあります。つまり、new キーワードを使用して通常のオブジェクトを作成できます。

各メソッド オブジェクトが作成されると、プロトタイプと呼ばれるプロパティが自動的に作成されます。このプロパティには特別な点はありません。他のプロパティと同様にアクセスして割り当てることができます。ただし、 new キーワードを使用してオブジェクトを作成すると、プロトタイプが機能します。その値 (オブジェクトでもあります) に含まれるすべてのプロパティが、新しく作成されたオブジェクトにコピーされます。以下に例を示します。

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

func.prototype。 name=” func のプロトタイプ";
var f = new func();
alert(f.name);

実行中に 2 つのダイアログ ボックスが表示され、後者のダイアログ ボックスが表示されます。 box 新しく作成されたオブジェクト f が func.prototype から name 属性をコピーすることを示します。前のダイアログ ボックスは、 func がメソッドとして実行されたことを示しています。なぜこの時点で func を再度実行する必要があるのか​​と疑問に思われるかもしれません。実はこのとき実行する func が「コンストラクタ」として機能します。視覚的に説明するために、もう一度実行してみましょう:
コードをコピーします コードは次のとおりです:

function func () {
this.name=”名前が変更されました。”
}
func.prototype.name=”func のプロトタイプ”;
var f = new func ();
アラート(f.name);

f の name 属性が「func のプロトタイプ」ではなく、「name が変更されました」に置き換えられていることがわかります。これは、 func オブジェクト メソッドが果たす「コンストラクター」の役割です。したがって、JavaScript では、new キーワードを使用してオブジェクトを作成すると、次の 3 つの手順が実行されます。 1. 新しい通常のオブジェクトを作成します。

2. メソッド オブジェクトのプロトタイプ プロパティのすべてのプロパティを新しい通常のオブジェクトにコピーします。
3. 新しい通常のオブジェクトをコンテキストとして使用して、メソッド オブジェクトを実行します。
「new func()」のようなステートメントは、「func から新しいオブジェクトを作成する」と記述することができます。つまり、prototype 属性の唯一の特別な点は、新しいオブジェクトを作成するときです。

それでは、これを活用してみましょう。たとえば、2 つのメソッド オブジェクト A と B があります。A から作成された新しいオブジェクトには A.prototype のすべてのプロパティが含まれるため、それを B.prototype に割り当てると、B から作成された新しいオブジェクトにもプロパティが含まれることになります。同じ特性ですか?コードは次のように記述されます:


コードをコピーします コードは次のとおりです:
A .prototype.hello = function (){alert('Hello!');}
B.prototype = new A();
new B().hello();

これは JavaScript で言うところの「継承」は本質的に属性のコピーであり、ここではプロトタイプを使用して実装されています。プロトタイプを使用しない場合は、ループを使用しても効果は同じです。いわゆる「多重継承」とは、当然のことながら、どこにでもコピーすることを意味します。
JavaScript におけるオブジェクト指向の原則は上記のとおりです。 JavaScript にはクラスという概念がないので、最初から最後まで「クラス」という概念について言及しませんでした。クラスなしでオブジェクト指向にすることは可能ですか?もちろん。クラスはもともとオブジェクトから派生するため、最初にクラスを持ち、その後にオブジェクトを置くのは合理的ではありません。次のようにします。


コードをコピーします コードは次のとおりです。
var o = { }; // 何かを発見しました。
o.eat = function(){return "私は食べています。"} // 食べられることがわかりました。
o.sleep = function(){return "ZZZzzz..."} //睡眠できることを発見しました;
o.talk = function(){return "Hi!"} // 会話できることがわかりました。
o.think = function(){return "うーん..." } // 考えることもできることを発見しました。
var Human = new Function(); // 名前を「Human」にしました。

Human.prototype = o; // これは「人間」のすべての概念を表します。

var h = new Human(); // 他に似たものを見つけたら、

alert(h.talk()) // これも「人間」であることがわかりました。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート