JavaScriptとC++の比較
JavaScriptは、Selfのような典型的なオブジェクト指向言語です。ただし、JavaScriptの構文はC /C++から借用しています。これは、古典的なオブジェクト指向のバックグラウンドから来たほとんどのプログラマーを混乱させるものです。
1.公的および私的財産
次のC++プログラムについて考えてみます。
#include <iostream>
using namespace std;
class Rectangle {
int height;
int width;
public:
Rectangle(int height, int width) {
this.height = height;
this.width = width;
}
int area() {
return height * width;
}
}
int main() {
Rectangle rectangle(3, 7);
cout << rectangle.area() << endl;
return 0;
}
これにより、次のように1対1でJavaScriptに変換されます。
main();
function Rectangle(height, width) {
this.area = function () {
return height * width;
};
}
function main() {
var rectangle = new Rectangle(3, 7);
console.log(rectangle.area());
return 0;
}
ここで注意すべきことがいくつかあります。
- 関数
main
は、宣言される前に呼び出されました。これが可能なのは、宣言が引き上げられているためです。前方宣言は必要ありません。
- 「
Square
クラス」(ahem、「コンストラクター関数」)は単純で小さいです。
- パブリックプロパティ(または関数)は、が指すオブジェクトに追加され
this
ます。
- それ以外はすべてプライベートです(クロージャを介してのみアクセスできます)。
2.共有パブリックプロパティ
C ++では、インライン関数のみがクラス本体内で定義されます。他のすべての関数は外部で定義する必要があります。ただし、通常、すべての関数(インライン関数を含む)は外部で定義されます。
#include <iostream>
using namespace std;
class Rectangle {
public:
int height;
int width;
Rectangle(int height, int width);
int area();
}
Rectangle::Rectangle(int height, int width) {
this.height = height;
this.width = width;
}
int Rectangle::area() {
return this.height * this.width;
}
int main() {
Rectangle rectangle(3, 7);
cout << rectangle.area() << endl;
return 0;
}
prototype
JavaScriptでは、コンストラクター関数のに共有メソッドを追加します(共有プロパティを作成しないでください) 。これは、上記のC++プログラムに似ています。そうすることの利点は、JavaScriptがコンストラクター関数のインスタンスごとに新しいメソッドを作成しないことです。
main();
function Rectangle(height, width) {
this.height = height;
this.width = width;
}
Rectangle.prototype.area = function () {
return this.height * this.width;
};
function main() {
var rectangle = new Rectangle(3, 7);
console.log(rectangle.area());
return 0;
}
クラス内でプロパティとメソッドを宣言する必要がないため、JavaSctiptバージョンは実際には小さくなっています。
3.パブリック静的プロパティ
C ++では、クラスの静的プロパティとメソッドを宣言できます。これは、クラスをオブジェクトとして使用するようなものです。関数をオブジェクトとして使用することもできます。それらはファンクターと呼ばれます:
#include <iostream>
using namespace std;
class Rectangle {
public:
int height;
int width;
static Rectangle fromSquare(int side);
Rectangle(int height, int width);
int area();
}
static Rectangle Rectangle::fromSquare(int side) {
return new Rectangle(side, side);
}
Rectangle::Rectangle(int height, int width) {
this.height = height;
this.width = width;
}
int Rectangle::area() {
return this.height * this.width;
}
int main() {
Rectangle square = Rectangle.fromSquare(5);
cout << square.area() << endl;
return 0;
}
関数はJavaScriptのオブジェクトであるため、(関数のように)プロパティを追加するだけです。これらの関数がコンストラクターとして使用される場合、関数のプロパティは静的プロパティと呼ばれます。
main();
Rectangle.fromSquare = function (side) {
return new Rectangle(side, side);
};
function Rectangle(height, width) {
this.height = height;
this.width = width;
}
Rectangle.prototype.area = function () {
return this.height * this.width;
};
function main() {
var square = Rectangle.fromSquare(5);
console.log(square.area());
return 0;
}
それでおしまい。JavaScriptとC++の同じコードのサイズの違いをご覧ください。どの構文が純粋な魔術であるかを決定します。=)
4.結論
JavaScriptでOOPに苦労している場合は、https ://github.com/javascript/augmentのように、役立つ古典的なオブジェクト指向ライブラリがたくさんあります。