摘要:JavaScript 覆寫原生方法 overwrite native method
如果你認為 eval is evil,可以透過覆寫 eval禁止使用…
當然,在正式環境這樣用一定會出事,沒有人用 eval就算了,真有人用,讓別人的程式壞掉還不被打嗎XD
程式要告知使用者執行結果,或其他訊息,可能會使用 alert,如果覺得 alert很醜、很礙事、很不友善,也可以覆寫 alert
但是 alert有些特性無法模擬,像是暫停 script執行,或是讓 alert依序一個一個執行在實作上也有點麻煩,還有阻擋滑鼠繼續點擊頁面之類的…所以這個想法只做完覆寫就不玩了XD;剩下可以勝出原有 API的部分我只想到 UI調整,讓每個瀏覽器 alert的介面相同…但這部分要勝過 jQuery UI要做的事更多…不如直接拿 jQuery UI來用XD
然後是本文的起源了…(是的,前面都是引申XD),剛剛想覆寫 document.write,記錄每次 write的內容,所以我寫了這個
但是這中間我遇到一個無法瞭解的錯誤
(function(doc) {
doc.write(123);
var _write = doc.write;
_write.apply(doc, [123]);
//_write(123); //CHROME: Illegal invocation,為什麼?如果是安全性考量,為什麼透過 apply又可以執行?
})(document);
附註:覆寫原生方法最初是在網路攻擊的文章裡面看到的,script file注入其他網站之後可以透過這樣的方式發動攻擊…一個防守的方法是透過建立 iframe產生乾淨、安全的環境,再用這裡面的原生方法,繞很大一圈,而且防守重點應該放在避免被注入啊~!