9

私の最新の JavaScript プログラム (これは、何よりも楽しみと概念実証のためのものです) には、さまざまな種類のオブジェクトがあり、それぞれの種類についてかなりの量の「インスタンス」があります。したがって、これらにはクラスを使用する必要があると考えていましたが、非常に単純であるため、クラスを使用する代わりに直接構築することができます...

私が意味するものの例:

//I'm making a "car" object that has the properties model, miles, value and color
//using a class like:
function car (model, miles, value, color) { .... }
//so I'd create a new car by using:
mycar = new car(model, miles, value, color);

//However for an object so simple I could also do:
mycar = {model: model, miles: miles, value: value, color: color};

後者の方法は何らかの方法でより効率的だと思いますが (クラスの関数を呼び出さない)、それだけの価値はありますか?

クラスを使用することと通常のオブジェクトを使用することの長所と短所について知りたいと思います。たとえば、クラスはより多くのメモリを消費しますか?

4

2 に答える 2

11

パフォーマンスに関しては、メソッドを追加すると違いが生じます。オブジェクト リテラルを使用する場合、各オブジェクトには各メソッドのフィールドが必要です。

obj1--> { x: 10,
          f1: method1,
          f2: method2 }

obj2--> { x: 17,
          f1: method1,
          f2: method2 }

クラスを使用すると、共有プロトタイプの背後で共通のプロパティを共有できます。

obj1--> { x:10,
          __proto__: --------> { f1: method1,
         }              /---->   f2: method2 }
                        |
obj2--> { x:17,         |
          __proto__: ---/
        }

とはいえ、多くのオブジェクトをインスタンス化し、それらのオブジェクトに多くのメソッドがあり、それらのメソッドの多くがクロージャーである場合にのみ、パフォーマンスの違いが問題になります。もし私があなただったら、コード スタイルの問題をより重視します。たとえば、オブジェクト リテラル メソッドではクロージャーを使用してプライベート変数をシミュレートできますが、メソッドが共有パブリック プロトタイプにある場合は、すべてのインスタンス変数をパブリックにする必要があります。 .

于 2013-10-04T15:38:49.020 に答える
3

まず、JavaScriptにはクラスがありません。違いは何ですか?

  • コンストラクターによってインスタンス化されたオブジェクトには、プロパティを継承するプロトタイプ オブジェクトがあります。このプロトタイプ オブジェクトは、同じ関数によって構築されたすべてのオブジェクトで共有されます。そこに一般的なメソッドを配置すると、かなり高速になります。
  • コンストラクター関数が呼び出されます。これを使用してオブジェクトを初期化 (デフォルトの入力、パラメーターの検証など) でき、クロージャーを構築するスコープがあります。

プロトタイプを必要としないオブジェクトがある場合でも、単純なオブジェクトを返す関数にはまだ利点があります。少なくとも、コードベースのすべてのインスタンスを変更する必要なく、実装を変更できる柔軟性を提供します。したがって、簡単なことから始めましょう

function Car (model, miles, value, color) {
    return {model: model, miles: miles, value: value, color: color};
}

(効果なしで呼び出すこともできnewます) 必要に応じて後で拡張します。

于 2013-10-04T15:58:05.233 に答える