我想让这段代码正常工作:
/** @constructor */
function Foo()
{
/** @const */
this.bar = 5;
// edit: does now work
// this.bar = 3;
}
var f = new Foo();
// should be inlined (like other constants)
alert(f.bar);
我已经尝试添加更多注释(类型,构造函数),@enum
而不是@const
(对于this.bar
),me = this
所有这些都没有任何效果
help page对此并没有多大帮助。
有没有办法让这个工作? 如果没有,为什么?
答案 0 :(得分:2)
添加/** @constructor */
有效:
/** @constructor */
function Foo()
{
/** @const */
this.bar = 5;
// cc does not complain
//this.bar = 3;
}
var f = new Foo();
// should be inlined
alert(f.bar);
汇编为:
alert((new function() { this.a = 5 }).a);
如果我取消注释this.bar = 3;
,我会收到此预期警告:
JSC_CONSTANT_PROPERTY_REASSIGNED_VALUE: constant property bar assigned a value more than once at line 9 character 0
this.bar = 3;
^
答案 1 :(得分:2)
编译器没有任何通用的“内联属性”逻辑。您可以使用原型函数将此内容置于ADVANCED模式中:
/** @constructor */
function Foo() {}
Foo.prototype.bar = function() { return 5 };
var f = new Foo();
alert(f.bar());
将编译为:
alert(5);
如果方法“bar”只有一个定义,并且“bar”仅在调用表达式中使用过,编译器将执行此操作。在一般情况下,用于此的逻辑是不正确的(如果调用是在没有定义“bar”的对象上,则调用将抛出)。但是,它被认为是“足够安全”。
答案 2 :(得分:0)
在文档中说:
如果为@const标记的变量被赋值多次,编译器会发出警告。 If the variable is an object, note that the compiler does not prohibit changes to the properties of the object.
P.S .: 你在脚本或HTML页面中包含以下代码吗?
<script src="closure-library/closure/goog/base.js"></script>