我的Web平台上具有以下本机JavaScript函数:
function tag_(t)
{
return (document.getElementsByTagName(t)) ? document.getElementsByTagName(t) : false;
}
还有原型:
Object.prototype.tag_ = function(t)
{
return (this.getElementsByTagName(t)) ? this.getElementsByTagName(t) : false;
}
此函数正常工作时,它将从DOM返回一个元素数组。
在实现Google Calendar的API时,我发现它决定覆盖此功能(虽然不是原型)。在浏览所有载入的原始JavaScript数据的 all (一如既往地禁用缓存)时,我没有提到字符串'tag _'。
如何保护Web平台上的本机功能不被第三方覆盖?
重命名功能而不使用Google的Calendar API是 可接受的答案。
显然可以“冻结”或“密封”对象:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
但是,这似乎不起作用:
Object.freeze(tag_);
这个问题没有没有有效的答案。
经过一些研究,我遇到了JavaScript代理(new Proxy(object_being_watched,function_called_onchange);
),但这不适用于函数,只能用于对象。 “ JavaScript中没有数组这样的东西!只有对象!” -“功能不是对象。”如果JavaScript并非被设计成狂热的灵活性,那么它会有用。
这是一种变通办法,尽管它会受各种条件的影响很大。
setTimeout(function()
{
window['tag_'] = function(t)
{
return (document.getElementsByTagName(t)) ? document.getElementsByTagName(t) : false;
}
},500);
答案 0 :(得分:1)
但是,这似乎不起作用:
Object.freeze(Object.prototype.tag_);
因为Object.prototype.tag_
是undefined
,所以密封是没有意义的。但是,您可以:
Object.freeze(window);
但这是一个坏主意。而是进行适当的作用域:
(function main() {
function tag_(t) {
return document.getElementsByTagName(t);
}
//...
})();
答案 1 :(得分:0)
也许在加载Google Calendar API之前先复制该函数,然后在加载后将其还原吗?