8

私は Javascript を学んでおり、Javascript と OOP に関していくつか質問があります。さまざまなチュートリアルの「クラス」で関数の宣言が異なることに気付きました。最初は内部コンストラクターです。

Class = function () {
  this.doSomething = function() {....};
}

もう1つは次のとおりです。

Class = function () {}
Class.prototype.doSomething  = function() {....};

どのような状況で最初の構文を使用する必要があり、どのような状況で 2 番目の構文を使用する必要がありますか?

protectedもう 1 つの質問は、js にはプロパティやメソッドがないことを正しく理解しているかどうかです。代わりに何を使用しますか?

前もって感謝します!

4

1 に答える 1

13

コンストラクター内で関数を として定義するとthis.myFunction=...、それはインスタンスに固有になります。これは、すべてのインスタンスに対して構築してメモリに保持する必要があることを意味しますが、これは重くなる可能性があります。また、継承することもできません。

これを行う唯一の正当な理由は次のとおりです。

  • 特定の値を囲む
  • 他のタイプの特定の関数 (毎回異なる関数を作成する可能性があります)

ほとんどの場合、実際に必要なのはプロトタイプで定義された関数です。

オブジェクトのMDNから:

JavaScript のすべてのオブジェクトは Object の子孫です。すべてのオブジェクトは Object.prototype からメソッドとプロパティを継承しますが、オーバーライドされる場合があります。たとえば、他のコンストラクターのプロトタイプはコンストラクター プロパティをオーバーライドし、独自の toString メソッドを提供します。Object プロトタイプ オブジェクトへの変更は、それらの変更の対象となるプロパティとメソッドがプロトタイプ チェーンに沿ってさらにオーバーライドされない限り、すべてのオブジェクトに反映されます。

追加の質問について:次のコードは、直接アクセスできない関数を構築します:

Class = function () {
   var imprivate = function(){...};
   this.doSomething = function() { uses imprivate};
}

欠点は、 のインスタンスごとに異なる関数インスタンスがあることですClass。これは、ほとんどの場合、モジュール(インスタンスが 1 つしかないモジュール) に対して行われます。個人的には、コメントで ThiefMaster が提案したとおりに行うことを好みます。プライベート関数の前に を付け_ます。

// private method
XBasedGrapher.prototype._ensureInit = function() {
于 2012-11-13T10:50:12.410 に答える