【问题标题】:Prevent uglifyjs from renaming certain functions防止uglifyjs重命名某些函数
【发布时间】:2012-10-09 19:41:20
【问题描述】:

我有一个函数,里面有一个构造函数。它创建一个新对象并返回它:

function car() {
   function Car() {}
   return new Car();
}

结果 uglify 将 Car 重命名为某个字母,当它返回时,看起来对象名称只是某个字母。例如,在 chrome 中,它会说对象的类型是“t”。

有没有办法告诉 uglify 保留某些函数的名称?

【问题讨论】:

  • 为什么重要?只是为了调试目的?无论如何,您不应该使用 uglified 版本进行调试。
  • 我会说它比其他任何东西都更具语义性。如果你向人们展示一个库,他们应该知道他们正在使用什么类型的对象。
  • 知道构造函数的名字是Car有什么帮助?看起来您正试图将其保密,因此您的库的用户不需要知道构造函数的名称是什么。如果是公共对象,则无需在函数中声明。
  • 我相信有些人会根据对象的名称检查类型:stackoverflow.com/questions/332422/… 在某些情况下可能有用吗?嗯..也许不是?

标签: javascript uglifyjs


【解决方案1】:

需要使用reserved-names参数:

--reserved-names “Car”

【讨论】:

    【解决方案2】:

    即使你遵循比尔的建议,你的方法仍然存在问题。

    car().constructor !== car().constructor
    

    人们会期望它们是平等的

    我会改变你创建构造函数并给它一个工厂构造函数的方法

    /** @private */
    function Car() {
       ...
    }
    
    Car.create = function() {
        return new Car();
    }
    

    或以下(模块模式),结合比尔的方法。这样你就不会每次都返回具有不同原型的对象

    var car  = (function() {
       function Car() {...}
       return function() {
           return new Car();
       }
    })();
    
    // car().constructor === car().constructor // true
    

    【讨论】:

    • 我想我正在这样做,除了最后额外返回一个函数:github.com/parris/iz/blob/master/iz.js#L388,为什么 return function() { return new Car(); } 为什么不直接退回新车呢?
    • @Parris 因为这样,每次调用car() 时都不会创建一个新的构造函数Car。自调用函数将构造函数放入一个闭包中,并且每次都使用同一个。您的示例每次都重新声明 function Car() {}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多