35

の主な違いは何ですか?

オブジェクト指向およびオブジェクトベースの言語

私は多くの投稿を読みましたそれらのすべてが2つのことを言っています

  1. オブジェクト指向言語はOOPのすべての機能をサポートし、オブジェクトベースの言語はポリモーフィズムや継承などのOOPのすべての機能をサポートするわけではありません。

  2. 彼らは、オブジェクトベースとしてのjavascriptとオブジェクト指向としてのjavaの例を示しています

stackoverflowのこの投稿のように

オブジェクト指向言語とオブジェクトベース言語の違い

しかし、言語に関係なく、両方の概念の主な違いは何であるかを知りたいです。

答えを得た

ついに物を手に入れた

おかげでMatías Fidemraizer

どの言語にも依存せず、どの機能にも依存しない答え、私が探しているコアの違いは

それ自体がオブジェクトを含む言語はオブジェクトベース言語と呼ばれ、オブジェクト指向の概念に従う言語はオブジェクト指向言語と呼ばれます。

4

8 に答える 8

25

JavaScript はプロトタイプ指向の言語です。

コンストラクター関数から実際のオブジェクトを構築でき、オブジェクトが持つことができるほぼすべての機能を備えています。

  • コンストラクタ。
  • メソッド (つまり、JavaScript の関数)。
  • プロパティ (ECMA-Script 5 以降、「ゲッター/セッター」)。
  • インスタンス。

JavaScript では、関数を含むすべてのオブジェクトにプロトタイプがあります。プロトタイプ自体は、オブジェクト全体の新しく作成されたインスタンスにオブジェクト メンバーを追加する基本的な方法です。

var constructor = function() { };
constructor.prototype.text = "hello world";

alert(new constructor().text); // This alerts hello world

JavaScript がオブジェクト指向プログラミング(スクリプト) 言語ではないのはなぜですか? オブジェクト指向プログラミングの定義の要件に適合する機能がないためです。

  • ポリモーフィズム:いいえ。プロトタイプ メンバーの動作を変更することはできますが、これは識別子を再利用しているだけです。疑似派生オブジェクトのメンバーの以前の実装にアクセスすることはできません。
  • 継承:まったくありません。プロトタイプ チェーンは継承に匹敵するかもしれませんが、JavaScript (ECMA-Script 5.x 以前のバージョン) には、他の OOP ベースの言語 (Java、C#、Ruby、Python、VisualBasic.NET など) のような構文ベースの継承はありません。 )。
  • カプセル化。はい、もちろんですが、実際のプライベートまたは内部オブジェクト メンバーを作成する方法はありません。

他の詳細について言及するのを忘れていたのかもしれませんが、正直なところ、これは良い要約だと思います。

アップデートとまとめ

主な違いは、オブジェクト指向プログラミング言語には、オブジェクト指向プログラミング言語と見なされるためにオブジェクト指向パラダイムが持たなければならない機能があることです。したがって、JavaScript は実際のポリモーフィズムと継承を欠いているため、現時点では実際のオブジェクト指向プログラミング言語ではありません

更新: ES2015 以降では状況は変わりましたか?

審美的に言えば、はい、ES2015 以降では、完全ではありませんが、よりオブジェクト指向プログラミングに近いものを考慮することができる大きな改善があります:スーパークラスを呼び出すための構文糖衣。

例えば:

class A {
     doStuff() {
         console.log("hello world");
     }
}

class B extends A {
     doStuff() {
         super.doStuff();
         console.log("...and goodbye!");
     }
}

これがポリモーフィズムです。より特殊化されたクラスは、その基本クラスをオーバーライドして、関数の動作を完全に変更するか、基本クラスが既に行っていたことを実行して、関数に新しいコードを追加できます。

ところで、ES2015以降にはまだ真のカプセル化が欠けています:アクセス修飾子はどこですか? privatepublic どこにも。

そして、結局のところ、ES2015 以降ではクラスベースの OOP が実装されていますが、それでも ECMAScript 5.x の上にある構文糖衣レイヤーです。上記のコードは、フードの下のプロトタイプでも機能し、同じように機能します。あたかも ECMAScript 5.x でコーディングするかのように:

function A() {
}

A.prototype.doStuff = function() {
    console.log("hello world");
};

function B() {
}

B.prototype = Object.create(A.prototype);
B.prototype.doStuff = function() {
    A.prototype.doStuff.call(this);
    console.log("...and goodbye!");
};

ES2020 は既にアクセス修飾子を提案しており、JavaScript をオブジェクト指向プログラミングを完全にサポートする別の言語と見なすことができるため、この回答を再度更新する必要があることを願っています!

于 2013-03-15T10:50:23.750 に答える
4

オブジェクトを使用するだけでは、完全な OO 言語であっても、OO テクニックを実装していない場合でも、OOP を行っているわけではありません。それは単にオブジェクトベースのプログラミングです。

于 2013-07-12T18:32:09.987 に答える
-3

オブジェクト指向言語

Object-orientd language supports all the features of OOPs

Object-orientd language does not has in-built object

Object-orientd languages are C++, C#, Java etc

オブジェクトベース言語

Object-based language doesn't support all the features of OOPs like Polymorphism and Inheritance

Object-based language has in-built object like JavaScript has window object.

Object-based languages are JavaScript, VB etc.

これで疑問が解消されることを願っています。

于 2016-05-05T10:24:35.343 に答える
-3

オブジェクト指向プログラミング言語は、OOP に属するすべての概念に従います。

オブジェクトベースのプログラミング言語にはオブジェクト ibuilt があるため、オブジェクトを作成する必要がなく、継承以外の OOP の概念にも従っています。

于 2015-10-12T09:38:11.130 に答える