あなたのポイントについて:
- 特に関数に関しては、間違いなくパフォーマンスが向上します。プロトタイプで関数を宣言する方がはるかに優れています。
- を書くことで情報を取得できるように、「パブリック」プロパティと言うつもりだったと思います
some_instance.foo
。「静的」プロパティ/メソッドは異なります (以下を参照)。
- 正しい。継承は、実際にはプロトタイプからのみ発生します。
これが役立つかどうかを確認するために、いくつかのことを説明しましょう。JavaScript で新しい「クラス」を作成するのは、かなり簡単なプロセスです。
var MyClass = new Function();
この時点で、エンジンは新しいクラスを認識しており、「クラス」の新しいインスタンスを作成するときに (パフォーマンスに関して) 「何をすべきか」を認識しています。
var my_instance = new MyClass();
プロトタイプを変更したい場合は、すべてのインスタンスが同じプロトタイプを共有しているため、すべてのインスタンスが更新されることがわかります。
MyClass.prototype.name = "default name";
console.log( my_instance.name ); //=> default name
これでエンジンは、文字列値を期待する「名前」プロパティがあることを認識します...それらのリソースをクラスのすべての新規および既存のインスタンスに割り当てます...これは非常に便利です。このように既存の「クラス」のプロトタイプを変更することは、コストのかかるプロセスであり、頻繁に実行するべきではないことに注意してください (ただし、実行することを恐れないでください)。
インスタンスでアドホックなプロパティ/メソッドを宣言することのパフォーマンスの長所と短所については、私は本当に話すことができません:
my_instance.foo = function() { /* this is not in the prototype chain */ };
私の推測では、これはエンジンにとって非常に単純であり、同時に何万ものオブジェクトに対してこれを行う場合を除き、大したことではありません。
プロトタイプ IMO を使用する主な利点は、コードを記述してメソッドの機能を拡張し、それに応じて「クラス」のすべてのインスタンスが更新されることを認識できることです。
var old_foo = MyClass.prototype.foo;
MyClass.prototype.foo = function() {
/* new business logic here */
// now call the original method.
old_foo.apply(this, arguments);
};
「静的」プロパティについては、「クラス」(コンストラクタ) 自体で宣言します。
// example static property
MyClass.num_instances = 0;
これで、次のような init/destroy メソッドを作成できます。
MyClass.prototype.init = function() {
this.constructor.num_instances++;
};
MyClass.prototype.destroy = function() {
this.constructor.num_instances--;
};
// and call the init method any time you create a new instance
my_instance.init();
console.log( MyClass.num_instances ); //=> 1
var instance_2 = new MyClass();
instance_2.init();
console.log( MyClass.num_instances ); //=> 2
instance_2.destroy();
console.log( MyClass.num_instances ); //=> 1
それが役立つことを願っています。