コンストラクターを呼び出すたびに再定義されないJavascriptプライベートメソッドをどのように作成しますか?
あなたはできません(まあ、少し小刻みに動く部屋については以下を参照してください)。ただし、のインスタンスが何千もある場合を除いてTester
、あまり心配する必要はありません。ほとんどのエンジンは、作成される複数の関数オブジェクト全体で基礎となるコードを再利用する可能性があります。(コード、マインド。関数オブジェクトやそれが閉じるコンテキストではなく、毎回一意で割り当てられる必要があります。ただし、大きくする必要はありません。もちろん、かなりの関数関数もかなり小さいです...)
...次のコードで関数が1回だけ宣言されていることを確認するにはどうすればよいですか?
あなたはそれがそうではないと確信することができます。Tester
呼び出されるたびに関数を宣言します。目撃者:
function Tester() {
this.test = test;
function test () {
console.log("executed");
}
}
var t1 = new Tester();
var t2 = new Tester();
console.log(t1.test === t2.test); // "false"
実装にプライベートであるが、オブジェクトのどのインスタンスにも割り当てられていない関数を持つことができることに注意してください。モジュールパターンは、それを行うのに便利です。
var Tester = (function() {
function Tester(name) {
this.name = name;
}
Tester.prototype.publicFunction = function() {
privateFunction.call(this);
};
function privateFunction() {
console.log("My name is " + this.name);
}
return Tester;
})();
var t = new Tester("Fred");
t.publicFunction(); // Outputs "My name is Fred" via the private function
そこでprivateFunction
は完全にプライベートであり、無名関数内のコードにのみアクセスできます。Tester
また、そのコピーは1つだけですが、を使用してインスタンスのメソッドを呼び出しているかのように呼び出すことができますprivateFunction.call(this)
。
あるいは、もちろん、使用call
は通常の呼び出しを行うよりも少し遅いので、インスタンスを引数として渡すことができます。
var Tester = (function() {
function Tester(name) {
this.name = name;
}
Tester.prototype.publicFunction = function() {
privateFunction(this);
};
function privateFunction(t) {
console.log("My name is " + t.name);
}
return Tester;
})();
var t = new Tester("Fred");
t.publicFunction(); // Outputs "My name is Fred" via the private function
もちろん、の追加コストは、call
それが問題である場合にのみ問題になります。タイトなループで何十万回も電話をかけているのでない限り、それが問題になることはまずありません。したがって、引数を使用するcall
かthis
渡すかは、主にスタイルの選択になります。