JavaScript は OOP 言語ですか?

黄舟
黄舟オリジナル
2017-10-21 10:06:401326ブラウズ

この話題は何度も議論されてきましたね。ただし、何度も言及されています。 Java、C#、またはその他の OOP 言語の開発者が JavaScript に触れるたびに、開発者は多くの不満を言います。彼らは、JavaScript の操作は完全に混乱しており、型がなく、適切に構造化されておらず、少し奇妙で、オブジェクトのサポートが貧弱で、明らかに OOP 言語ではないと言います。

これらの苦情の中には受け入れられるものもあるかもしれませんが、JavaScript には型がないため OOP 言語ではないなど、偏見のあるものもあります。後者の点については、結論に飛びつく前に、次のことを自問する必要があります。プログラミング言語がオブジェクト指向プログラミング言語である理由は何でしょうか。

OOPとは何ですか?

OOP パターンには正式な標準仕様はありません。 OOP とは何か、何がそうでないのかを定義する技術文書はありません。 OOP の定義は主に、Kristen Nygaard、Alan Kays、William Cook などの初期の研究者によって発表された論文の常識に基づいています。オブジェクト指向は次の 2 つの要件に基づいているため、OOP を定義する試みと、プログラミング言語を分類するために広く受け入れられている定義が数多く試みられてきました:

  • オブジェクトを通じて問題をモデル化する機能。

  • モジュール性とコードの再利用を可能にするいくつかの原則をサポートします。

最初の要件を満たすには、開発者が次のようにオブジェクトを使用して現実を記述し、オブジェクト間の関係を定義できるようにする必要があります:

  • 関連付け: オブジェクトが別の独立したオブジェクトを参照できる機能。

  • 集約: オブジェクトを 1 つ以上の独立したオブジェクトに埋め込む機能。

  • 構成: 1 つ以上の依存オブジェクトを埋め込むオブジェクトの機能。

一般に、言語が次の原則をサポートしている場合、2 番目の要件は満たされます:

  • カプセル化: データと操作コードの単一のエンティティに焦点を当て、その内部の詳細を隠す機能。

  • 継承: オブジェクトが 1 つ以上の他のオブジェクトから一部またはすべての要素を取得するメカニズム。

  • ポリモーフィズム: データ型または構造に応じてオブジェクトを異なる方法で処理する機能。

これらの要件を満たす言語は、通常、オブジェクト指向として分類されます。

JavaScript と OOP

これで、OOP 言語がどのようなものであるべきかがわかりました。では、JavaScript が OOP 言語であることを証明できるでしょうか?試してみよう。

JavaScript オブジェクトの関連付け、集約、結合をサポートする機能が強力ではないことはわかっています。次のコードを見てください:

var johnSmith = {
 firstName: "John",
 lastName: "Smith",
 address: { //Composition
 street: "123 Duncannon Street",
 city: "London",
 country: "United Kingdom"
 }
};
var nickSmith = {
 firstName: "Nick",
 lastName: "Smith",
 address: { //Composition
 street: "321 Oxford Street",
 city: "London",
 country: "United Kingdom"
 }
};
johnSmith.parent = nickSmith; //Association
var company = {
 name: "ACME Inc.",
 employees: []
};
//Aggregation
company.employees.push(johnSmith);
company.employees.push(nickSmith);

上記のコードでは、組み合わせの例 (address 属性)、関連付けの例 (parent 属性)、および集計の例 (employees 属性) を見つけることができます。

カプセル化に関しては、JavaScript オブジェクトはデータと関数をサポートするエンティティですが、内部の詳細を隠すための高レベルのネイティブ サポートはありません。 JavaScript オブジェクトはプライバシーを気にしません。注意しないと、すべてのプロパティとメソッドにパブリックにアクセスできます。ただし、オブジェクトの内部状態を定義し、外部アクセスから保護するために、いくつかの手法を適用できます。ゲッターとセッターを使用して クロージャ を利用します。

JavaScript は、いわゆるプロトタイプ継承を通じて基本レベルでの継承をサポートします。開発者の中には少し単純すぎると考える人もいますが、JavaScript の継承メカニズムは完全に有効であり、ほとんどの認識されている OOP 言語と同じ結果を得ることができます。どう考えても、JavaScript には「オブジェクトが 1 つ以上の他のオブジェクトから一部またはすべての機能を取得する」仕組みがあり、これが継承です。

多くの人がこの概念をデータ型と関連付けているため、ポリモーフィズムへの挑戦はさらに難しいようです。実際、ポリモーフィズムはプログラミング言語の多くの側面に影響しており、OOP 言語に関連するものだけではありません。通常、これにはジェネリック、オーバーロード、構造サブタイプなどの項目が含まれます。これらすべては、「単純」で型付けが弱い言語である JavaScript にとっては圧倒的に思えるでしょう。しかし、そうではありません。JavaScript では、さまざまな種類のポリモーフィズムをいくつかの方法で実現でき、私たちは気付かないうちに何度もポリモーフィズムを実行している可能性があります。

クラスのないOOP

「わかりましたが、繰り返しになりますが、JavaScriptにはクラスがありません。」

多くの開発者は、JavaScriptにはクラスの概念がないと信じており、JavaScriptは真のオブジェクト指向言語であるとは考えていません。 OOP 原則は適用されません。

ただし、非公式の定義ではクラスについて明示的に言及されていないことがわかります。確かに、物体には性質や原理が必要です。ただし、クラスは実際には必須ではなく、共通のプロパティを持つオブジェクトのセットを抽象化するための便利な方法である場合があるだけです。したがって、言語のサポート オブジェクトにクラスがない場合でも、それは JavaScript などのオブジェクト指向言語である可能性があります。

さらに、OOP 原則の目的はサポートされるように設計されています。言語でプログラミングする場合、OOP 原則は必須ではありません。開発者は、オブジェクト指向コードの作成を可能にする構成を使用することを選択することも、使用しないことを選択することもできます。開発者が OOP 原則に違反するコードを作成できるため、多くの人が JavaScript を批判します。ただし、これは プログラマ の選択にすぎず、言語の制限ではありません。これは、C++ などの他のプログラミング言語でも同様に発生します。

したがって、抽象クラスの欠如と、開発者が OOP 原則をサポートする機能を使用するか使用しないかを自由にできることは、JavaScript を OOP 言語として識別する上での本当の障害ではないと結論付けることができます

以上がJavaScript は OOP 言語ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。