摘要: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产生干净、安全的环境,再用这里面的原生方法,绕很大一圈,而且防守重点应该放在避免被注入啊~!
原文:大专栏 JavaScript 覆写原生方法 overwrite native method