是否有可能从代码中的谷歌闭包中获取编译的函数名称?

时间:2017-01-24 16:08:29

标签: javascript google-closure-compiler

我在代码中有一个部分,我需要通过名称覆盖该函数。 它的简化版本在这里:

function override(obj, funcName){
   if(obj && obj[funcName])
      obj[funcName] = function(){ alert("Haha, now it's different func!"); }
   else
      console.error("Object does not contain function "+funcName);
}

它完美无缺,除非我使用Google Closure编译它,当然,它没有,因为函数obj.doSomethingBeneficial变得像obj.qq ......

所以问题是:是否可以从代码中知道函数的编译名称是什么?然后我可以正确覆盖它。

1 个答案:

答案 0 :(得分:1)

编译器识别一个特殊的函数名,它允许您重命名字符串,方法与重命名属性的方式相同:goog.reflect.objectProperty(prop name, obj)。该函数是闭包库的一部分,但您可以自己定义它而不包括闭包库。

var goog = { reflect: { objectProperty: function(name, obj) { return name; } } };
if (obj && obj['funcName']) {
  obj[goog.reflect.objectProperty('funcName', obj)] =
      function(){ alert("Haha, now it's different func!"); };
} else {
  console.error("Object does not contain function "+ 'funcName');
}

需要注意的是,goog.reflect.objectProperty的第一个参数必须是字符串文字。你不能使用变量。