友人と私は先週議論をしました。彼は、JavaScriptにはクラスのようなものはないと述べました。
var object = new Object()
と言うことができると言った
「Word class
は使用されていないため、クラスではありません」と彼は言います。
誰が正しい?
メモとして。将来的には、簡潔なClassy JS実装が必要です:
https://github.com/tnhu/jsface
編集:2017年7月
ECMAScript 2015で導入されたJavaScriptクラスは、主にJavaScriptの既存のプロトタイプベースの継承に対する構文上の糖です。クラス構文は、JavaScriptに新しいオブジェクト指向の継承モデルを導入していません。 JavaScriptクラスは、オブジェクトを作成して継承を処理するためのはるかに単純で明確な構文を提供します。
-Mozilla ES6クラス: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes
技術的には、「JavaScriptにはクラスがありません」という文が正しいです。
JavaScriptはオブジェクト指向言語ですが、 クラスベースの言語 ではなく、 プロトタイプベースの言語 です。これら2つのアプローチには違いがありますが、JavaScriptをクラスベースの言語のように使用できるため、多くの人(私を含む)はしばしばコンストラクタ関数を単に「クラス」と呼んでいます。
Javascriptはオブジェクト指向プログラミング言語ですが、それでも2015年にはECMAスクリプト6クラスが導入され、Javaのような他のクラスベースの言語と同様に使用できるようになりました。もちろん、ユーザーのコードマジシャンがコメントで指摘したように、jsでのクラスの動作とJavaまたは他の「クラスベースの」プログラミング言語との間には深い違いがあります。
それでも、jsプログラミングでは、たとえば次のようなコードを使用できます。
class Animal {
constructor(name) {
this.name = name;
}
class Dog extends Animal {
speak() {
console.log(this.name + ' barks.');
}
}
ソース: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
これは、古典的なクラスベースの言語と共通点があります。問題は、現在開始されたばかりのこの新しいテクノロジーのブラウザーサポートです。そのため、プロダクション製品で使用するのはまだよくありません。しかし、この問題が迅速に解決されることは間違いありません。
したがって、この新しい機能の実装のためにjsがクラスベースのプログラミング言語になったのか、それともオブジェクトプロトタイプ指向のプログラミング言語のままであるのかという疑問が残ります。
Javascriptでは、ほとんどすべてがobject
です(オブジェクトは他のオブジェクトから継承できます)。古典的な意味でclasses
はありません。
関数プロトタイピングにより、従来のクラス定義/インスタンス化のほとんどの機能を再現できます。
ここでダグラス・クロックフォードの講演を聞いてください:
http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-2
彼はプレゼンテーションであなたの質問に直接答えます。
この言語の最も物議をかもす特徴は、継承の方法です。これは、事実上他のすべての現代言語とは根本的に異なります。ほとんどの言語はクラスを使用します-私はそれらを「古典言語」と呼びます-JavaScriptは使用しません。 JavaScriptはクラス無料です。プロトタイプを使用します。言語を見る古典的な訓練を受けた人々のために、彼らは行きます:まあ、これは不十分です。あなたはクラスを持っていません、どうすれば何かを成し遂げられますか?プログラムの構造が機能することをどのように確信できますか?そして、彼らはそれを決して超えません。しかし、結局のところ…
「言語Xにはクラスがある」とは、通常、オブジェクト指向プログラミングのサポートを意味します。
はい、Javascriptはオブジェクト指向言語です。
クラスについて考えるとき、型と、クラスによって新しい型を定義できるという事実を考えます。 jsでは、新しい型を作成できません。プロトタイプを使用してあらゆる種類の豪華なオブジェクトを作成できますが、すべてがオブジェクトであるという事実は、クラスのないjsの性質を実際に受け止めます。 jsについて話しているときに「クラス」の用語を使用している人は、sい新しい演算子よりも、jsをプロトタイプ言語としてjsとクラシック言語としてjsを混同していると思います。要するに、jsがOOであるという理由だけで、クラスが存在する必要があることを意味しません。
FromYou-Dont-Know-JShttps://github.com/getify/You-Dont-Knowの本-JS
第4章:ミキシング(上)「クラス」オブジェクト
...
JSにはかなり長い間、クラスに似た構文要素(newやinstanceofなど)がありましたが、最近ではES6にclassキーワードなどの追加要素がありました。
しかし、それはJavaScriptが実際にクラスを持っているということですか? 平易でシンプル:いいえ
ここでは他の部分をコピーして過去に渡すつもりはありませんが、第3章&第4章サンプルを実行します。
https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch3.mdhttps://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch4.md
他の答えを追加すると、javascriptにはクラスがありませんが、クラスのようなものとして記述されているステートメントを見始めていますが、問題を混乱させるだけだと思います。
JavaScriptにはクラスではなくプロトタイプがありますが、それらは同じことを実現します。プロトタイプはオブジェクトを定義するオブジェクトであるため、混乱が生じます。
プロトタイプは、クラスがJavaで管理するプライベート内部状態の表現です。その内部状態をクラスに入れ、Java、JavaScriptのように動作を操作するためのインターフェースを提示する代わりにJavaScriptプログラムのデータ構造を公開して、直接操作します。
これは私がこのテーマで見つけた最高の説明です プロトタイプはクラスではありません 。
簡単な言葉で-はい。 Chrome browser。JavaScriptクラスは関数の一種です。クラスはclassキーワードで宣言されます。関数式を使用します。関数を初期化する構文とクラスを初期化するクラス式構文。
関数を使用したJavaScriptクラスの例を次に示します。
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// Method
calcArea() {
return this.height * this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
JavaScriptにはES6より前のクラスはありませんでしたが、ES5ではオブジェクトをシールすることでクラスのような動作を実装できました(これにより、オブジェクトを非拡張可能にしました)。封印されたオブジェクトでは、新しいプロパティとメソッドを追加できず、プロパティを構成できません。プロパティ値は引き続き設定および読み取りが可能です。ひとつ注意点があるので、クラスのように言います。シールされたオブジェクトのメソッド定義は引き続き変更できます。これは、すべてのメソッドプロパティを書き込み不可に変更しない限り、プロパティ値を設定できるためです。この時点で、ES5を使用してクラスの動作をかなり再現しました。