Javascript 闭包编译器:重命名对象键,但仍能在其他脚本中使用原始键

Javascript 闭包编译器:重命名对象键,但仍能在其他脚本中使用原始键,javascript,google-closure-compiler,Javascript,Google Closure Compiler,此代码将重命名对象键,并且仍然能够使用原始键调用函数 // ==ClosureCompiler== // @compilation_level ADVANCED_OPTIMIZATIONS // @output_file_name default.js // ==/ClosureCompiler== var myClass = function() { this["myFunc"] = this.myFunc; this["myFunc2"] = this.myFunc2; }; wi

此代码将重命名对象键,并且仍然能够使用原始键调用函数

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// ==/ClosureCompiler==

var myClass = function() {
  this["myFunc"] = this.myFunc;
  this["myFunc2"] = this.myFunc2;
};
window["myClass"] = myClass;

myClass.prototype = {
  myFunc: function() { alert("myFunc"); },
  myFunc2: function() { alert("myFunc2"); }
};
编入

function a(){
    this.myFunc=this.a;
    this.myFunc2=this.b
}
window.myClass=a;
a.prototype={
    a:function(){alert("myFunc")},
    b:function(){alert("myFunc2")}
};
新的myClass.myFunc或新的a.a都可以

但是,此方法需要多次声明myFunc1、myFunc2…myFuncN

是不是其他方法也能达到同样的效果

我想通过闭包编译器将所有myFunc重命名为类似这样的

在同一个脚本中,调用myClass.myFunc将编译为a.b

但我仍然可以在其他脚本中调用window.myClass.myFunc

非常感谢。

新建myClass.myFunc应该可以:

无论如何,您也可以通过以下方式导出方法:

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==

var myClass = function() {
   //don't declare your exports here
};

myClass.prototype["myFunc"] = function() { alert("myFunc"); };
myClass.prototype["myFunc2"] = function() { alert("myFunc2"); };

window['myClass'] = myClass;
这不太容易出错,因为您不必记住初始化所有方法名。 它汇编为:

function a() {
}
a.prototype.myFunc = function() {
  alert("myFunc");
};
a.prototype.myFunc2 = function() {
  alert("myFunc2");
};
window.myClass = a;
我想使用window.myClass.myFunc在其他脚本上访问它们

这表明您希望以不同的方式设置窗口的属性,例如,新窗口的结果

window.myClass = (function () { // make a closure with IIFE
    function a() {
        // if all you want is on the prototype, nothing to do here
    }
    a.prototype = { // set prototype
        myFunc: function () {alert("myFunc")},
        myFunc2: function () {alert("myFunc2")}
    };
    return new a(); // construct, return out of IIFE
}()); // Invoke IIFE
现在,window.myClass是一个带有原型的构造对象,您可以使用

window.myClass.myFunc(); // alerts "myFunc"
如果原型设计/继承对您不重要,您可以简单地执行

window.myClass = { // set directly
    myFunc: function () {alert("myFunc")},
    myFunc2: function () {alert("myFunc2")}
};
如果原型/继承对您很重要,但您不需要构建,并且可以使用现代浏览器

window.myClass = Object.create(
    { // prototype
        myFunc: function () {alert("myFunc")},
        myFunc2: function () {alert("myFunc2")}
    }
);

您将需要一个新的a;//a{myFunc:function,myFunc2:function,a:function,b:function}在原型上声明myFunc,myFunc2时,在其周围加上引号,cc不会重命名它们,您可能希望jsdoc公开方法show我可以使用闭包编译器将所有myFunc重命名为,但我仍然能够在其他脚本中调用window.myClass.myFunc?您是否尝试过此代码?window.myClass即使在闭包编译器编译后也会设置。编译后,您的代码将返回window.a.b,我可以在同一脚本中使用它,但不能从其他脚本调用window.myClass.myFunc。