4

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

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

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

4

4 回答 4

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/

于 2012-06-19T00:45:44.670 回答
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
  • ETC...

更新 2

恢复原始功能的新方法:

var win=window.open("about:blank");
win.close();
Object.prototype.hasOwnProperty = win.Object.prototype.hasOwnProperty;

有点骇人听闻。或者您可以创建一个隐藏的<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);
于 2012-06-19T00:29:50.290 回答
1

如果有人覆盖它,唯一不会丢失它的方法是让您在有人覆盖它之前保留自己的参考。

因此,在包含任何其他脚本之前,请包含以下脚本

var hasOwnProp = Object.prototype.hasOwnProperty;

hasOwnProp在其他任何地方使用。

于 2012-06-19T00:17:18.290 回答
0

对我来说,这不是问题。您在帖子和评论中声明:

  • 这是假设的
  • 这是基于“某人”可以修改您的脚本的事实,而您对此无能为力。
  • 您对任何涉及控制脚本加载顺序的解决方案都不满意。

为什么不?你不是开发者吗?如果“某人”确实修改Object.prototype.hasOwnProperty了,解决方案非常简单:从您的页面中删除有问题的脚本!并不是有人闯入了你的代码并这样做了,而是你链接到了某人写得不好的脚本。

PS:如果这不是您问题的实际答案,我很抱歉,但评论太长了。

于 2012-06-19T00:52:08.567 回答