背景:我想重写一个库(我没有写)以避免闭包编译器使用高级选项生成警告。根据这个问题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:这种语法(with new
)var c1 = new CurrencyObject(1.99);
不会以我可以检测到的方式改变代码的行为,但我认为存在差异。它是什么?
Q3:当c2被实例化时,是创建函数的副本还是c1和c2共享相同的(函数)代码?(如果正在创建函数的副本,我应该进行哪些更改以避免这种情况?)
TIA
顺便说一句:如果有人想知道,对象文字中的符号会被引用以避免让 Closure-Compiler 重命名它们。