有没有办法从更改Object.prototype.hasOwnProperty的人恢复?

时间:2012-06-19 00:01:12

标签: javascript prototype hasownproperty

您总是会看到for-in循环应该检查o.hasOwnProperty(k)以跳过Object.prototype。好吧,如果有人愚蠢到足以修改Object.prototype,谁会说他们不会做任何与现有原型冲突的事情?例如,如果有人运行这个:

Object.prototype.hasOwnProperty = function () {
    return !!'I am stupid';
};

如果这是第一个运行的脚本,这是否意味着,对于页面其余部分的每个脚本,实际上不可能安全地迭代对象?

4 个答案:

答案 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 );
}());

现场演示: http://jsfiddle.net/ARycC/2/

答案 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
  • 等...

更新2

恢复原始功能的新方法:

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:如果这不是您问题的实际答案,我很抱歉,但评论时间过长。