【发布时间】:2015-04-19 21:35:48
【问题描述】:
我知道以前有人问过类似的问题,但方法变化很快,所以我想了解当前的最佳做法。 (事实上,就在 2 天前,Chad Killingsworth 在三年前的 accepted answer 上添加了一条评论,指出 @expose 注释现在已弃用。)
我正在使用module pattern。以下代码的工作JSFIDDLE:
/** @const */
var MATHCALCS = (function () {
'use strict';
var MY = {};
/**
* @constructor
* @param {!Object} obj
* @expose
*/
MY.ModuleStruct = function (obj) {
/** @expose */
this.color = (obj.color !== undefined) ? obj.color : null;
/** @expose */
this.size = (obj.size !== undefined) ? obj.size : null;
};
/**
* @expose
*/
MY.ModuleStruct.prototype.clone = function () {
return new MY.ModuleStruct({
"color": this.color,
"size": this.size
});
};
MY.moduleProperty = 1;
/**
* @type {function(!Array<number>)}
* @expose
*/
MY.moduleMethod = function (a) {
var i, x = 0;
for (i = 0; i < a.length; i += 1) {
x = x + a[i];
}
return x;
};
return MY;
}());
window["MATHCALCS"] = MATHCALCS;*
目前,使用@expose注解,上面可以用Closure提前模式缩小,下面的调用工作(minified example):
// call a public method
alert(MATHCALCS.moduleMethod([1, 2, 3]));
// allocate a new structure
var ms = new MATHCALCS.ModuleStruct({
"color": "red",
"size": "small"
});
alert(ms.color + '\t' + ms.size);
// clone a second instance
var ms2 = ms.clone();
alert(ms2.color + '\t' + ms2.size);
alert(ms !== ms2); // cloned objs are not equal
// and directly update the properties of the object
ms2.color = "white";
ms2.size = "large";
alert(ms2.color + '\t' + ms2.size);
如果可能,在不改变模块模式的情况下,我想更新代码(大约 10,000 行)以使用 @export 注释。但是,当我将 @expose 替换为 @export 时,Closure 会引发此错误:
错误 - @export 仅适用于在全局范围内定义的符号/属性。
问:有没有可能,如果有,上面的代码应该如何注释才能使用 ADVANCED_OPTIMIZATIONS?
我知道我可以使用这种类型的符号:
MY["ModuleStruct"] = MY.ModuleStruct;
MY["ModuleStruct"]["prototype"]["clone"] = MY.ModuleStruct.prototype.clone;
但是以这种方式导出对象属性会变得乏味。进一步的 JSLint 抱怨奇怪的分配,所以我宁愿使用 JSDocs 注释。
【问题讨论】:
-
@export是正确的方法。看起来我们需要做一些工作来支持这种类型的用例。 -
@ChadKillingsworth,感谢您提出问题单。如果在
@export支持@expose的这种模式之前不删除对@expose表示法的支持,那将是非常好的。 -
@expose支持在相当长的一段时间内不会从编译器中删除。但是,现在将发布有关其使用的警告。我将尽快改进@export。
标签: javascript module google-closure-compiler