[英]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.