JavaScriptオブジェクト指向それでもオブジェクト指向ではありませんが、JavaScript は完全に混乱していて、型がなく、構造が不合理で、奇妙で、オブジェクトのサポートが貧弱で、決して OOP 言語ではないと言う人もいます。 JavaScript は本当におっとり言語ではないのでしょうか?一緒に見ましょう!
知っています、このトピックは何度も議論されてきました。ただし、何度も言及されています。 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; //Associationvar company = { name: "ACME Inc.", employees: [] };//Aggregationcompany.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を使用して疑似クラススタイルを変更する方法
以上がJavaScript は真の OOP 言語ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。