如何保护本机函数不被Google API覆盖

时间:2018-08-17 21:46:09

标签: javascript google-calendar-api

我的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);

2 个答案:

答案 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之前先复制该函数,然后在加载后将其还原吗?