web-dev-qa-db-ja.com

JavaScriptはオブジェクト指向ですか?

JavaScriptがオブジェクト指向言語であるかどうかについて、いくつかの質問がありました。 「言語にオブジェクトがあるからといって、それがオブジェクト指向になるわけではありません。」

JavaScriptはオブジェクト指向言語ですか?

55
ScottKoon

IMO(そしてそれは単なる意見です)オブジェクト指向言語の主要な特徴は、 多型 ほとんどすべての動的言語がそれを行います。

次の特性は encapsulation であり、これはJavascriptでも簡単に実行できます。

しかし、多くの人の心の中では inheritance (具体的には実装継承)であり、言語がオブジェクト指向と呼ばれる資格があるかどうかのバランスを崩します。

Javascriptは、プロトタイプを介して実装を継承するためのかなり簡単な手段を提供しますが、これはカプセル化を犠牲にします。

したがって、オブジェクト指向の基準がポリモーフィズム、カプセル化、および継承の古典的な3つである場合、Javascriptは合格しません。

Edit:「プロトタイプ継承はカプセル化をどのように犠牲にしますか?」非プロトタイプのアプローチのこの例を考慮してください:

function MyClass() {
    var _value = 1;
    this.getValue = function() { return _value; }
}

_value属性はカプセル化されており、外部コードで直接変更することはできません。クラスにミューテーターを追加して、クラスの一部であるコードによって完全に制御される方法で変更することができます。次に、同じクラスへのプロトタイプのアプローチを検討します。

function MyClass() {
  var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }

まあこれは壊れています。 getValueに割り当てられた関数は_valueのスコープ内にないため、アクセスできません。 _valueをthisの属性に昇格させる必要がありますが、それによりクラス用に記述されたコードの制御外でアクセス可能になるため、カプセル化が壊れます。

それにもかかわらず、Javascriptはオブジェクト指向であるという私の投票はまだ残っています。どうして? [〜#〜] ood [〜#〜] が与えられているため、Javascriptで実装できます。

53
AnthonyWJones

簡単な答えは「はい」です。詳細については:

From Wikipedia

JavaScriptは非常にオブジェクトベースです。オブジェクトは、プロトタイプで拡張された連想配列です(以下を参照)。オブジェクトプロパティ名は連想配列キーです:obj.x = 10とobj ["x"] = 10は同等であり、ドット表記は単なる構文上の砂糖です。プロパティとその値は、実行時に追加、変更、または削除できます。オブジェクトのプロパティは、for ... inループを介して列挙することもできます。

また、 この一連の記事 about OOP with JavaScriptを参照してください。

36
Eli Bendersky

Javascriptは、手続き型のオブジェクト指向(プロトタイプベース)および関数型プログラミングスタイルをサポートするマルチパラダイム言語です。

以下に 記事 の方法を説明しますOO Javascriptで。

24
jop

言語は、オブジェクト指向であるためにJavaとまったく同じように動作する必要はありません。Javascriptのすべてはオブジェクトです。C++または以前のJavaはある程度オブジェクト指向と考えられていますが、ポリモーフィズムは、Javascriptでは問題になりません。型についてはあまり気にしないためです。構文で直接サポートされない唯一のコアOO機能は継承ですが、簡単に実装できますが、プログラマはプロトタイプの使用を望んでいます: here はそのような例の1つです。

19
Eevee

JavaScriptはオブジェクト指向ですが、クラスベース Java、C++、C#などのオブジェクト指向言語ではありません。クラスベースOOP言語はサブセットですOOP言語のより大きなファミリーのうち、JavaScriptやSelfなどのプロトタイプベースの言語も含まれています。

10
munificent

はいといいえ。

JavaScriptは、ダグラスクロックフォードが言うように、「 世界で最も誤解されているプログラミング言語 」です。彼はいくつかの JavaScriptの素晴らしい記事 を持っているので、正確にJavaScriptとは何かを読むことを強くお勧めします。 LISPとの共通点はC++です。

10
David Mohundro

JavaScriptは、プロトタイプベースのプログラミング言語です(おそらく、プロトタイプベースのスクリプト言語の方がより正確な定義です)。継承ではなくクローンを使用します。プロトタイプベースのプログラミング言語は、クラスのないオブジェクト指向プログラミングのスタイルです。オブジェクト指向プログラミング言語は、分類と関係に焦点を当てた開発を奨励しますが、プロトタイプベースのプログラミング言語は、最初に振る舞いに焦点を合わせ、次に分類することを奨励します。

「オブジェクト指向」という用語は、1967年にアランケイによって造られました。

メッセージング、ローカル保持および状態プロセスの保護と非表示、およびすべてのものの極端な遅延バインディングのみ。 (ソース)

オブジェクト指向プログラミングでは、各オブジェクトはメッセージを受信し、データを処理し、他のオブジェクトにメッセージを送信できます。

オブジェクト指向の言語には、カプセル化、モジュール性、多態性、継承などの機能が含まれる場合がありますが、必須ではありません。クラスを利用するオブジェクト指向プログラミング言語は、多くの場合、クラスベースのプログラミング言語と呼ばれますが、クラスを利用してオブジェクト指向にする必要はありません。

JavaScriptは、プロトタイプを使用して、メソッドや継承などのオブジェクトプロパティを定義します。

結論:JavaScript ISオブジェクト指向。

8
Vefýsing

ほとんどのオブジェクト指向言語とは異なり、JavaScript(とにかくECMA 262 Edition 4以前)にはクラスの概念はありませんが、プロトタイプがあります。そのため、オブジェクト指向と呼ぶかどうかは、実際にある程度主観的です。

@eliben:ウィキペディアは、object-basedと言います。それはオブジェクト指向と同じではありません。実際、 オブジェクトベースの記事 はオブジェクト指向言語とプロトタイプベース言語を区別し、明示的にJavaScriptを呼び出しますnotオブジェクト指向。

6
Sören Kuklau

JavaScriptは、オブジェクト指向のWebアプリを作成するのに非常に優れた言語です。 OOPをサポートできます。これは、プロトタイピングによる継承もプロパティとメソッドもサポートしているためです。ポリモーフィズム、カプセル化、および多くのサブクラス化パラダイムを持つことができます。

3
CMS

これはもちろん主観的であり、学問的な問題です。 OO言語はクラスと継承を実装する必要があるかどうかを主張する人もいれば、あなたの人生を変えるプログラムを書く人もいます;;)

(しかし、実際には、なぜOO言語はクラスを実装する必要があるのでしょうか?objectsが重要なコンポーネントだと思います。それらを作成して使用する方法は別の問題です)

2

itisは良いスレッドです。ここに私が好きないくつかのリソースがあります。ほとんどの人は、異なるオブジェクトモデルを持つプロトタイプ、jquery、または上位6つのライブラリ(mootools、ExtJS、YUI)のいずれかから始めます。プロトタイプは、ほとんどの人が考えるように古典的なO-Oを再現しようとします

http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/

ここに私がよく参照するプロトタイプと関数の写真があります

http://www.mollypages.org/misc/js.mp

2
Gene T

私は別の角度から跳ね返されたこの質問に答えています。

これは永遠のトピックであり、多くのフォーラムで火炎戦争を開くことができます。

JavaScriptがOOプログラミング言語であると人々が断言するとき、これでOODを使用できるので、私は尋ねます:なぜCはOOプログラミング言語ではないのですか?繰り返しますが、CでOODを使用できます。CがOOプログラミング言語であると言ったら、誰もがあなたがおかしいと言ってくれるでしょう。

このトピックはインターネットよりも古いため、非常に古い本やフォーラムでこのトピックに関する多くの参照をここに置くことができます:)

JavaScriptは長年変更されていませんが、新しいプログラマーはJavaScriptがOOプログラミング言語であることを示したいと考えています。どうして? JavaScriptは強力な言語ですが、OOプログラミング言語ではありません。

OOプログラミング言語には、オブジェクト、メソッド、プロパティ、クラス、カプセル化、集約、継承、およびポリモーフィズムが必要です。このすべてのポイントを実装できますが、JavaScriptにはありません。

非常にわかりやすい例:「オブジェクト指向JavaScript」の第6章で「継承」を実装する10のマナー。 Javaにはいくつのマナーがありますか? 1つ、そしてC++で? 1つは、Delphi(Object Pascal)ですか? 1つ、Objective-Cですか? 1。

なぜこれが違うのですか? Java、C++、Delphi、Objective-CはOOPを念頭に置いて設計されていますが、JavaScriptではありません。

私が学生だったとき(1993年)、大学で、典型的な宿題がありました。OOD以外の言語でOOD(オブジェクト指向設計)を使用して設計されたプログラムを実装します。当時、選択された言語はC(C++ではなく)でした。このプラクティスの目的は、OODとOOPの違いを明確にし、OOPと非OOP言語を区別できるようにすることでした。

とにかく、すべての人々がこのトピックについて何らかの意見を持っているわけではないという証拠です:)

とにかく、私の意見では、JavaScriptは強力な言語であり、クライアント側のレイヤーの未来です!

2
angelcervera

Hanselminutes episode 146 OO Ajaxを見てください。意見を形成するのに役立つ良いショーであり、間違いなく良いショーでした。

1
Aaron Powell

Misko Heveryは優れた入門Google Tech Talkを行い、Javascriptのオブジェクトについて話しました。これは、Javascriptでのオブジェクトの使用に疑問を抱いている人、またはそれらを使い始めたい人にとって、良い出発点であることがわかりました。

1

JavaScriptは従来のOOの意味で。残念ながら(IMHO)、ECMAScript 4で提供されているクラスではありません。 la prototype!:-)

0
Andrew Hedges

JavaScriptはオブジェクト指向ですか?

回答:はい

データとそのデータに作用するメソッドを含むことができるオブジェクトがあります。オブジェクトには他のオブジェクトを含めることができます。

  • クラスはありませんが、クラス変数やメソッドのコンテナとして機能するなど、クラスが行うことを行うコンストラクタがあります。
  • クラス指向の継承はありませんが、プロトタイプ指向の継承はあります。

オブジェクトシステムを構築する主な2つの方法は、継承(is-a)と集約(has-a)です。 JavaScriptは両方を行いますが、その動的な性質により、集計時にExcelで実行できます。

JavaScriptは情報隠蔽を提供しないため、JavaScriptは真のオブジェクト指向ではないと主張する人もいます。つまり、オブジェクトにプライベート変数とプライベートメソッドを含めることはできません。すべてのメンバーはパブリックです。

ただし、JavaScriptオブジェクトにはプライベート変数を含めることができますおよびプライベートメソッドであることがわかります。 (方法については、ここをクリックしてください。)もちろん、JavaScriptは世界で最も誤解されているプログラミング言語であるため、これを理解している人はほとんどいません。

JavaScriptは、継承を提供しないため、真のオブジェクト指向ではないと主張する人もいます。ただし、JavaScriptは従来の継承だけでなく、他のコード再利用パターンもサポートしています

ソース: http://javascript.crockford.com/javascript.html

0

JavaScriptのオブジェクトは、オブジェクトから直接継承します。よりオブジェクト指向にできるものは何ですか?

0
Pavel Feldman

真のOO Java/C#のような言語と同じまたは類似の設計パターンをたどることができれば、ほとんどOO言語と呼ぶことができます。一部の側面は明らかに異なりますが、非常に確立されたOO design pattersn。

0
mattlant

JavaScriptはオブジェクト指向であり、オブジェクト指向ではありません。違いは、オブジェクト指向言語は適切な継承をサポートしていますが、オブジェクト指向言語は適切な継承をサポートしていることです。

JavaScriptで「通常の」継承を実現する方法はありますが( ここを参照 )、基本モデルはプロトタイピングに基づいています。

0
dsm

技術的にはプロトタイプ言語ですが、その中にOOと書くのは簡単です。

0
Rik

オブジェクト指向ですが、クラスに基づいているのではなく、プロトタイプに基づいています。

0
Vasil

Javascriptは、主に真の継承がないため、通常考慮されるオブジェクト指向言語ではありません。DUCK型は、複雑な関数共有を可能にするObject.prototypeとともに、半真の形の継承/ポリモーフィズムを可能にします。しかし、基本的に、継承の欠如は、DUCKの型付けが同じ属性名を持つオブジェクトを、それらが使用されることを意図していないオブジェクトのインスタンスであると主張するので、弱いポリモーフィズムの発生につながります。したがって、ランダムオブジェクトに属性を追加すると、そのタイプのベースが話し方で変換されます。

0
bmeck

はい、そうです。ただし、継承とポリモーフィズムに欠けるオブジェクト指向プログラミング言語で期待されるすべての機能をサポートしているわけではありません。ただし、これは、言語で利用可能なプロトタイピングシステムを介してこれらの機能をシミュレートできないことを意味するものではありません。

0
MikeJ

Microsoft Ajax Client Library を使用すると、javascriptでOOを実装するのが簡単になります。

0
urini

個人的には、OOPプログラミングの主な魅力は、非公開(プライベート)の内部動作を持つ自己完結型のクラスを持つ能力です。

Javascriptで終わりが無いのは、使用している外部ライブラリのどこかに同じ関数名があるというリスクがあるため、関数名さえ使用できないことです。

いくつかの非常に賢い人々がこのための回避策を見つけましたが、最も純粋な形式のJavascriptが非常に読めないコードを作成することを要求するのは奇妙ではありませんか?

OOPの利点は、構文を気にすることなく、アプリのロジックについて考えることに時間を費やすことができることです。

0
Kokodoko

Javascriptのすべてはオブジェクトです-クラスはオブジェクト、関数はオブジェクト、数値はオブジェクト、オブジェクトオブジェクトオブジェクトです。他の言語ほど厳密に入力することはできませんが、OOP JS。

0
matt lohkamp