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

Closure compiler: rename object key but still able to use original key in other script

本文关键字:脚本 其他 原始 重命名 编译器 对象 闭包      更新时间:2023-09-26

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

// ==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")}
};

(new myClass()).myFunc()(new a()).a()均工作

然而,此方法需要声明myFunc1myFunc2。。。myFuncN多次

是不是其他方式也可以实现同样的事情?

我想用闭包编译器将所有myFunc重命名为a(类似这样)

在相同的脚本调用中,myClass.myFunc()将编译为a.b()

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

非常感谢。

我想使用window.myClass.myFunc 在其他脚本上访问它们

这表明您希望以不同的方式设置window的属性,即new的结果,例如

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")}
    }
);

(new 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;