代码之家  ›  专栏  ›  技术社区  ›  John

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

  •  0
  • John  · 技术社区  · 8 年前

    我的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返回一个元素数组。

    在实现googlecalendar的API时,我发现它决定重写这个函数(而不是原型)。在经历 全部的 在加载的原始JavaScript数据中(始终禁用缓存),我没有发现字符串“tag\”。

    重命名函数和不使用Google的calendarapi都是很重要的 一个可以接受的答案。


    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

    但这似乎不起作用:

    Object.freeze(tag_);
    

    这个问题确实如此 有一个有效的答案。

    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 回复  |  直到 8 年前
        1
  •  1
  •   Jonas Wilms    8 年前

       Object.freeze(Object.prototype.tag_);
    

    因为 Object.prototype.tag_ undefined 密封是没有意义的。但是您可以:

      Object.freeze(window);
    

      (function main() {
        function tag_(t) {
           return document.getElementsByTagName(t);
        }
        //...
      })();
    
        2
  •  0
  •   alejandro    8 年前

    也许在加载googlecalendarapi之前复制函数,然后在加载之后还原它?