Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以避免使用getter和setter的模式,并且仍然使用Closure-ADVANCED\u优化缩小JavaScript?_Javascript_Google Closure Compiler - Fatal编程技术网

是否可以避免使用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