さて、これはここにあります:
var self = this;
パフォーマンスへの影響はまったくありません。ローカル変数にアクセスするだけなので、非常に高速です。ネストされた関数からでも、これは JavaScript での非常に高速な操作です。
ただし、コンストラクターで作成されたメソッドとプロトタイプで作成されたメソッドには、パフォーマンスに大きな違いがあります。
この例では:
var PrototypeModExample = function(){
this.name = "Joe";
};
PrototypeModExample.prototype.sayHello = function(){
alert("Hello, " + this.name);
};
var a = new PrototypeModExample();
var b = new PrototypeModExample();
console.log(a.sayHello === b.sayHello); // true
コンストラクターのすべてのインスタンスは、同じ関数オブジェクトにアクセスできます。===
これは、演算子を使用して 2 つのインスタンスの関数オブジェクトを比較することで証明できます。true
それらが同じオブジェクトである場合にのみ返されます。したがって、グローバルには 2 つのインスタンスがありますが、sayHello
メソッドの実装のために 1 つの関数オブジェクトを共有しています。これは、新しいインスタンスを作成するときに、関数が既にセットアップされ、作成されていることを意味します。
つまり、すべてのインスタンスobj.sayHello
は、インスタンスが存在する前に作成された同じ関数オブジェクトを指します。
しかし、これは一方で:
function SelfIdiomExample(name){
var self = this;
this.name = "Joe";
this.sayHello = function(){
alert("Hello, " + self.name);
}
}
var a = new SelfIdiomExample();
var b = new SelfIdiomExample();
console.log(a.sayHello === b.sayHello); // false
動作が異なります。===
これで、比較が偽であることがわかります。これは、インスタンスごとに新しい関数オブジェクトが作成されたためです。この関数を作成するには、時間 (解析する必要があります) とメモリ (その関数のこの一意のバージョンを保存する必要があります) が必要です。したがって、これらのインスタンスを多数作成すると、この方法は遅くなり、より多くのメモリを消費します。
つまり、すべてのインスタンスobj.sayHello
は、インスタンス自体が作成されたときに作成された一意の関数オブジェクトを指します。
したがって、通常はプロトタイプ方式が好まれます。特に多数のインスタンスが存在する可能性がある場合は、各インスタンスがそのメソッドの関数オブジェクトを共有できるためです。