背景:クロージャーコンパイラーが詳細オプションで警告を生成しないように、ライブラリー(私は作成しませんでした)を書き直したいと思います。この質問ごとに、JavaScriptの「this」キーワードとクロージャコンパイラの警告に対する答えは、クロージャを使用してコードを書き直すことでした。目的は、キーワードthis
(コンパイラー警告を生成する)の使用を避けることです。
ライブラリには多くの関数があるので、新しいクロージャがオブジェクトリテラルを返すのが最善だと思います。これがどのように機能し、考えられる影響について理解したいと思います。したがって、私は次の(意味のない)例を学習の練習として書きました(ここでも:jsFiddle):
var CurrencyObject = function(Amount) {
var money = Amount;
return {
"toCents": function() {
money *= 100;
return money;
},
"toDollars": function() {
money /= 100;
return money;
},
"currentValue": money // currentValue is always value of Amount
};
}; // end currencyObject
var c1 = CurrencyObject(1.99); // what's the difference if the syntax includes `new`?
alert('cents = ' + c1.toCents() + '\ncurrent money = ' + c1.currentValue + '\ndollars = ' + c1.toDollars() + '\ncurrent money = ' + c1.currentValue);
var c2 = CurrencyObject(2.99);
alert('cents = ' + c2.toCents() + '\ncurrent money = ' + c2.currentValue + '\ndollars = ' + c2.toDollars() + '\ncurrent money = ' + c2.currentValue);
alert('cents = ' + c1.toCents() + '\ncurrent money = ' + c1.currentValue + '\ndollars = ' + c1.makeDollars() + '\ncurrent money = ' + c1.currentValue);
Q1:toCentsの呼び出し後にcurrentValueが更新されないのはなぜですか?( currentValueは、CurrencyObjectが最初に実行されたときに初期化されるリテラル(?)であるためだと推測します。その場合、プロパティcurrentValueも返すための構文は何ですか?)
Q2:この構文(とnew
)var c1 = new CurrencyObject(1.99);
は、私が検出できる方法でコードの動作を変更しませんが、違いがあると思います。それは何ですか?
Q3:c2がインスタンス化されるとき、作成されている関数のコピーですか、それともc1とc2は同じ(関数)コードを共有しますか?(関数のコピーが作成されている場合、それを回避するためにどのような変更を加えますか?)
TIA
ところで:誰かが疑問に思っている場合は、Closure-Compilerが名前を変更しないように、オブジェクトリテラルの記号が引用符で囲まれています。