Javascript クラス (またはシングルトン オブジェクト) を正しく構築する方法を理解しようとしています。
それら(「クラス」とシングルトンオブジェクト)には大きな違いがあります。最初の 2 つの例は、1 回限りのオブジェクト (シングルトン) です。3 番目 (最後) の例では、同じプロトタイプを共有する複数のオブジェクトを作成できるコンストラクター関数を作成します。あなたがやっているようにそれを置き換えるのではなく、コンストラクター関数のプロパティを拡張することをお勧めします。prototype
var Thingy = function() { // Or use a function declaration rather than expression
// Optional initialization code here
};
Thingy.prototype.foo = 'bar';
Thingy.prototype.method = function() {
// Method code here
};
(コンストラクター関数は、慣例により、大文字で始まります。)
どちらを使用するか (シングルトン関数またはコンストラクター関数) は、必要なものによって異なります。
ES2015 (別名「ES6」) の時点では、非メソッド プロトタイプ プロパティ ( your foo
) を定義するための新しい構文はありませんが、より単純になっています。この提案が進めば、おそらく ES2017 または ES2018 にあるでしょうが、それまでは:
class Thingy {
constructor() {
// Optional initialization code here
}
method() {
// Method code here
}
}
Thingy.prototype.foo = 'bar';
継承階層に入る必要がある場合、古い ES5 構文ではかなりの配管が必要です。
var Base = function() {
};
Base.prototype.method = function(arg1) {
// ...
};
var Derived = function() {
Base.call(this);
};
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;
Derived.prototype.method = function(arg1) {
// Using Base's `method`, if desired, is a bit ugly:
Base.prototype.method.call(this, arg1);
};
...これが、Prototype のClass
ものや私自身のLineageなどのライブラリが登場するのを見た理由です。これらは ES2015 構文では時代遅れですが、これにより非常に簡単になります。
class Base {
method(arg1) {
// ...
}
}
class Derived extends Base {
method(arg1) {
// Use's the superclass's `method`, if desired, is easy:
super.method(arg1);
}
}
あなたの質問のタイトルを再:
Javascript クラスを作成する正しい方法は何ですか?
JavaScript は非常に柔軟な言語であるため、JavaScript でオブジェクトの「クラス」を作成するには、同じように正しい方法がいくつかあります。標準のコンストラクター関数、「ビルダー」関数Object.create
(ES5 対応環境で) があり、より直接的なプロトタイプの継承を行うことができます。JavaScript の優れた点の 1 つは、「クラス」のスタイルを選択できることです。