是否可以避免使用getter和setter的模式,并且仍然使用Closure-ADVANCED\u优化缩小JavaScript?
我想在是否可以避免使用getter和setter的模式,并且仍然使用Closure-ADVANCED\u优化缩小JavaScript?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我想在ADVANCED\u OPTIMIZATIONS模式下使用闭包编译器缩小JavaScript。这是我目前正在尝试的一种模式: var myClosure = (function () { var NS = {}; NS.foo = 100; var MyConstructor = function (aValue) { this.aValue = aValue; }; NS["MyConstructor"] = MyConstruct
ADVANCED\u OPTIMIZATIONS
模式下使用闭包编译器缩小JavaScript。这是我目前正在尝试的一种模式:
var myClosure = (function () {
var NS = {};
NS.foo = 100;
var MyConstructor = function (aValue) {
this.aValue = aValue;
};
NS["MyConstructor"] = MyConstructor;
MyConstructor.prototype.setAValue = function (v) {
this.aValue = v;
};
NS["MyConstructor"].prototype["setAValue"] = MyConstructor.prototype.setAValue;
MyConstructor.prototype.readAValue = function () {
return this.aValue;
};
NS["MyConstructor"].prototype["readAValue"] = MyConstructor.prototype.readAValue;
return NS;
}());
window["myClosure"] = myClosure;
它工作正常,我可以使用以下命令调用缩小的代码:
var obj = new myClosure.MyConstructor(10);
alert(obj.readAValue());
obj.setAValue(100);
alert(obj.readAValue());
一个演示的例子
尽管上述方法可行,但编写该项目需要的所有getter和setter将非常麻烦,以便能够调用编译后的代码
有没有一种模式可以让我避免使用getter/setter方法
或者,如果没有,是否有一种方法可以让我判断重构代码以使其能够通过ADVANCED_optimization
调用是否值得付出努力。(我估计添加这些方法将使未编译代码的行数增加5%以上)此外,我目前有大约1300个QUnit断言测试。要运行这些测试,有近10000个任务需要从以下内容重写:
obj.ValueA = 100;
obj.ValueB = 200;
到
为了测试缩小的代码
因此,如果可能的话,一种不同的方法肯定是合适的。
@expose
就是为了这个目的而创建的
/** @expose */
MyConstructor.prototype.aValue
一旦您分配了类似于MyConstructor.prototype.setAValue的内容,就不需要通过NS属性引用再次进行分配,因为您只是在更新完全相同的prototype对象。@Pointy,您指的是这一行
NS[“MyConstructor”].prototype[“setAValue”]=MyConstructor.prototype.setAValue代码>,对吗?这条线是关闭的必要条件。否则,当它将setValue
重命名为Ba
时,来自编译代码外部的调用将中断。带引号的结构设置了一个别名。我不确定你的意思,但带引号的赋值与不带引号的赋值完全相同。也就是说,
和[]
操作符在属性名的值确定后对对象执行完全相同的操作;唯一的区别是,
要求属性名是一个标识符,它的值是在解析时确定的,而不是在运行时确定的。@要了解我的意思,请查看问题中引用的小提琴。在那里,您将看到缩小的代码。闭包将MyConstructor.prototype.setAValue更改为a.prototype.c
。为了能够在闭包外部(即从非精简代码)调用该方法,需要创建一个未重命名的别名。带引号的字符串构造创建别名。用闭包编译器的术语来说,这是一个导出
。无法知道如何重命名方法,因此如果要从外部代码调用代码,则需要导出。这两个结构必须是相同的;我完全误解了你问题的全部意思。我道歉。我会重新开始:)工作得很有魅力。我知道@expose
,但我没有太多关注它,因为它是,因此我没有考虑它的应用。谢谢你指出这一点。
/** @expose */
MyConstructor.prototype.aValue