簡體   English   中英

如何保護本機函數不被Google API覆蓋

[英]How to protect a native function from being overwritten by Google API

我的網絡平台上具有以下本機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數據(一如既往地禁用緩存)時​​,我沒有提到字符串'tag_'。

如何保護Web平台上的本機功能不被第三方覆蓋?

重命名功能,而不是使用谷歌的日歷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);

但是,這似乎不起作用:

   Object.freeze(Object.prototype.tag_);

因為Object.prototype.tag_undefined ,所以密封是沒有意義的。 但是,您可以:

  Object.freeze(window);

但這是一個壞主意。 相反,只需進行適當的作用域設置即可:

  (function main() {
    function tag_(t) {
       return document.getElementsByTagName(t);
    }
    //...
  })();

也許在加載Google Calendar API之前先復制函數,然后在加載后將其還原?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM