您总是会看到for-in循环应该检查o.hasOwnProperty(k)
以跳过Object.prototype。好吧,如果有人愚蠢到足以修改Object.prototype,谁会说他们不会做任何与现有原型冲突的事情?例如,如果有人运行这个:
Object.prototype.hasOwnProperty = function () {
return !!'I am stupid';
};
如果这是第一个运行的脚本,这是否意味着,对于页面其余部分的每个脚本,实际上不可能安全地迭代对象?
答案 0 :(得分:3)
您可以创建临时IFRAME元素,并从其Object.prototype
对象中检索该方法:
(function () {
var frame = document.createElement( 'iframe' );
frame.style.display = 'none';
document.body.appendChild( frame );
Object.prototype.hasOwnProperty = frame.contentWindow.Object.prototype.hasOwnProperty;
document.body.removeChild( frame );
}());
答案 1 :(得分:2)
function secret(){
var HOP = Object.prototype.hasOwnProperty;
this.getHOP = function(){
return HOP;
}
}
new secret().getHOP(); //Will now be the copy of hasOwnProperty
//and nobody can modify it
//stupid script:
Object.prototype.hasOwnProperty = function () {
return !!'I am stupid';
};
//restore
Object.prototype.hasOwnProperty = new secret().getHOP(); //DONE.
如果在加载每个脚本之前修改它,那么你可以这样做:
Object.prototype.hasOwnProperty = String.prototype.hasOwnProperty
他们是一样的。 :D
还有更多供您复制:
Boolean.prototype.hasOwnProperty
Number.prototype.hasOwnProperty
Function.prototype.hasOwnProperty
恢复原始功能的新方法:
var win=window.open("about:blank");
win.close();
Object.prototype.hasOwnProperty = win.Object.prototype.hasOwnProperty;
有点hacky。或者您可以创建隐藏的<iframe>
。
var win = document.createElement("iframe");
win.style.display = "none";
document.body.appendChild(win);
Object.prototype.hasOwnProperty = win.contentWindow.Object.prototype.hasOwnProperty;
document.body.removeChild(win);
答案 2 :(得分:1)
如果有人覆盖它,唯一的办法是不要失去它,这是你在有人覆盖之前保留自己的参考。
因此,在包含任何其他脚本之前,请包含以下脚本
var hasOwnProp = Object.prototype.hasOwnProperty;
并在其他地方使用hasOwnProp
。
答案 3 :(得分:0)
对我来说,这不是问题。您在帖子上说明并评论:
为什么不呢?你不是开发者吗?如果“某人”确实修改了Object.prototype.hasOwnProperty
,解决方案非常简单:从页面中删除有问题的脚本!这并不像是有人闯入你的代码并做到了这一点,而是你链接到某人写得不好的剧本。
PS:如果这不是您问题的实际答案,我很抱歉,但评论时间过长。