我在代码中有一个部分,我需要通过名称覆盖该函数。 它的简化版本在这里:
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
......
所以问题是:是否可以从代码中知道函数的编译名称是什么?然后我可以正确覆盖它。
答案 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
的第一个参数必须是字符串文字。你不能使用变量。